et-nik / gameap

Game Admin Panel (GameAP) is the opensource game servers control panel.
https://gameap.com
99 stars 22 forks source link

Открытие консоли сервера вызывает высокую нагрузку процессом PHP #23

Open r4sas opened 4 years ago

r4sas commented 4 years ago

Не знаю где именно в коде происходит это, но FPM начинает нагружать ядро до 70%

Возможно что не очень хороший алгоритм фильтра последних записей лога.

et-nik commented 4 years ago

Получение лога записей происходит вот тут: https://github.com/et-nik/gameap/blob/develop/app/Services/ServerService.php#L156

Там же происходит и обрезка текста консоли.

Как долго работал игровой сервер? В корне игрового сервера есть файл output.txt каков его размер?

et-nik commented 4 years ago

Предполагаю, что output.txt скопил довольно много записей и стал большого размера.

Сам принцип да, далеко не самый лучший, PHP-FPM нужно получить содержимое файла, а затем его обрезать. Можно переложить эту обязанность на GDaemon, он справится с этим легко не требуя много.

r4sas commented 4 years ago

Как долго работал игровой сервер? В корне игрового сервера есть файл output.txt каков его размер? Предполагаю, что output.txt скопил довольно много записей и стал большого размера.

Достаточно много, вес под 3 гига)))

Можно переложить эту обязанность на GDaemon, он справится с этим легко не требуя много.

Я бы сказал что в общем против output.txt - файл в постоянной блокировке на запись, его невозможно подчистить (даже с помощью logrotate). Если бы был алгоритм лимитирования веса файла самим демоном - другое дело. Но в идеале вижу решение следующего вида:

  1. Возможность включать/выключать хранение лога в output.txt
  2. Возможность задать лимит веса файла (зачем хранить весь вывод? Его только если в отладочных целях при падении иметь, чтобы знать причину падения, например.)
  3. При запросе консоли в панели производить запрос к GDaemon и в нем формировать буффер выведенных сервером строк (в памяти), который будет отправляться в ПУ с переодичностью в N секунд (конфигурируемо на уровне выделенного сервера).

Последний пункт скорее всего придется реализовывать на вебсокете.

r4sas commented 4 years ago

Ну и дополнительно: https://gist.github.com/deizel/3846335 Не знаю как быстр substr, но скорее всего лучше лимитировать по строкам.

Можно ли не вычищать буффер конфсоли на странице, а дополнять его, если будет реализован вывод по строкам? Аналогично не хватает возможности переключения в более полноразмерный режим, а то это окошечко не всегда удобно =)

et-nik commented 4 years ago

Подумывал вернуться обратно к Screen, но использовать не ту версию, что в дистрибутивах Debian, Ubuntu, CentOS. В дистрибутивах сейчас старая версия Screen и есть баги с русской кодировкой. А более свежую версию использовать, где нет багов из-за которых я отказался от Screen. Но тогда пакеты нужно самому собирать.

В Screen есть лимиты и есть возможность сохранить лог в файл. Удобная.

С вебсокетами всё равно придётся дело иметь, т.к. консоль будет на них переведена рано или поздно.

r4sas commented 4 years ago

А можно ли приделать к gameap-starter команду очистки лога? Чтобы можно было хотя бы с помощью logrotate вызывать.

Добавить поддержку сигнала USR1 по поторому бы вызывался std::ofstream::trunc.

et-nik commented 4 years ago

Да, можно