Почему большой расход RAM в фоновых PHP скриптах?

В фоне запущенно 300 PHP скриптов. В разных местах скрипта напичкан лог потребления памяти
$mem = round((memory_get_usage() / 1024000), 3) . ' MB';


В итоге все значения выдают от 5 до 6 мб. Т.е. получается 300 скриптов * 6 мб памяти = 1 800 мб потребляемой RAM.
Но команда free -m показывает, что используется 12-13 ГБ.

Есть подозрения, что это из-за MySQL т.к. каждый экземпляр скрипта тянет за собой соеденение с базой которое висит по 5-7 часов (время выполнения скрипта).
SHOW PROCESSLIST
показывает чуть более 300 процессов.

Есть вариант отказаться от постоянного соеденения с базой, написать API которое будет работать с этой базой. Т.е. фоновый пхп скрипт (которых 300 штук) будет работать не напрямую с БД, а по REST API. Это позволит избежать от большого кол-ва висящих соединений с БД.

Поможет это сократить потребление RAM или может быть причина не в этом?
  • Вопрос задан
  • 1231 просмотр
Пригласить эксперта
Ответы на вопрос 6
PretorDH
@PretorDH
HTML5, CSS3, PHP, JS - люблю в чистом виде.
Как на меня то 300 штук фоновых это многовато. Нужно ли столько в риллтайм?

Все запросы не риллтайм к фоновому скрипту - выделить, объединить в queue и/или перенести на исполнение rest server/service. Пусть фоновый скрипт/сервис/сервер (в единственном или небольшом числе) исполняет их потихоньку вытягивая из очереди.

P.S. Просто перенеся функциональность фонового скрипта на rest api ничего не поменяется. Будет тоже количество соединений. И "те же грабли, только в профиль."
Ответ написан
Stalker_RED
@Stalker_RED
Ваши фоновые процессы в основном пишут, или читают?

Запросы по rest API либо будут порождать новые подключения каждый раз, либо, если обращаетесь к демону, могут мешать друг-другу и выстраиваться в очередь.

Возможно, стоит воспользоваться чем-то типа gearman?
Ответ написан
solotony
@solotony
покоряю пик Балмера
со стороны клиента открытое соединение с БД это просто открытый сокет. так что тут вряд-ли проблема.

зачем 300 "висящих по 5-7 часов" скриптов ? Они усиленно трудятся в это время ?
Ответ написан
@synapse_people
если процессы форкаются, то память шарится
Ответ написан
Комментировать
@Rakovskiy28 Автор вопроса
Ок, допустим 32 гб мне хватит примерно на 900-1000 процессов (задач). Меня это устраивает, но тут появилась новая проблема.
Прошло немного времени и при таком же кол-ве задач памяти стало пожирать раза в 2-2.5 больше.
5a5a056487a14800246830.png

Смотрю htop и вижу, что у mysql висит не один процесс как раньше, а много, каждый из которого занимает около 300 мб памяти.
5a5a05f7f3b9b002162089.jpeg
Ответ написан
Комментировать
Предполагаю, что 5-6 Мб на процесс не так и много, эту память могут просто занимать загруженные библиотеки и модули вашего приложения. Для проверки этой гипотезы создайте скрипт с загрузкой тех же библиотек, что используется в ваших фоновых скриптах, но не извлекающий ничего из базы данных, и замерьте использование памяти. Но, если скрипты начинают использовать больше памяти со временем, то возможно вы не очищаете какие то переменные, например есть массив, в который складываются какие-то данные на каждой итерации, но не очищаются в конце. В таком случае, я думаю, что проблему нужно искать в вашем коде.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы