Пассажирские процессы перезапускаются, даже если PassengerPoolIdleTime равен 0 - PullRequest
3 голосов
/ 08 апреля 2010

Я установил PassengerPoolIdleTime в 0, ожидая, что это означает, что я могу "прогреть" кучу пассажирских процессов на моем сервере, и в следующий раз у меня будет всплеск трафика (даже если это будет несколько дней спустя), все они будут разогреты и готовы принимать запросы.

Вместо этого я вижу, что каждое утро, когда я встаю, passenger-status показывает только несколько процессов, и все они работают только с полуночи. В предыдущий день я разогрел кучу процессов, и в последний раз я смотрел на passenger-status (до полуночи) было 50.

Вот весь фрагмент кода, связанный с пассажирами, из моего httpd.conf (я нахожусь в CentOS):

LoadModule passenger_module /usr/local/lib/ruby/gems/1.8/gems/passenger 2.2.11/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.11
PassengerRuby /usr/local/bin/ruby
PassengerMaxPoolSize 60
PassengerPoolIdleTime 0

Я проверил crontabs на наличие root и apache, чтобы выяснить, не может ли что-то вызвать перезапуск apache, но я этого не вижу.

Вот фрагмент кода passenger-status, около 11 часов и 46 минут после полуночи:

----------- General information -----------
max      = 60
count    = 3
active   = 0
inactive = 3
Waiting on global queue: 0

----------- Domains -----------
/var/www/myapp/current: 
  PID: 20704   Sessions: 0    Processed: 360     Uptime: 11h 44m 16s
  PID: 20706   Sessions: 0    Processed: 4249    Uptime: 11h 44m 9s
  PID: 20708   Sessions: 0    Processed: 14189   Uptime: 11h 44m 9s

И вот что я вижу, если я делаю ps aux | grep apache:

apache   13297  0.0  0.0 546652  5312 ?        Sl   14:28   0:00 /usr/sbin/httpd.worker
apache   13332  0.0  0.0 546652  5336 ?        Sl   14:28   0:00 /usr/sbin/httpd.worker
apache   13334  0.0  0.0 546652  5328 ?        Sl   14:28   0:00 /usr/sbin/httpd.worker
root     16841  0.0  0.0   6004   628 pts/0    S+   15:48   0:00 grep apache
root     20478  0.0  0.0  88724  3640 ?        Sl   04:02   0:01 /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.11/ext/apache2/ApplicationPoolServerExecutable 0 /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.11/bin/passenger-spawn-server /usr/local/bin/ruby  /tmp/passenger.30916
apache   20704  0.0  1.7 251080 135164 ?       S    04:02   0:06 Rails: /var/www/apps/myapp/current                                                                                                                                                
apache   20706  0.2  1.7 255188 137704 ?       S    04:02   1:52 Rails: /var/www/apps/myapp/current                                                                                                                                                
apache   20708  0.9  1.7 255180 139332 ?       S    04:02   6:26 Rails: /var/www/apps/myapp/current

Сервер работает по UTC, поэтому 04:02 соответствует 12:02 моего времени (EDT).

Ответы [ 4 ]

3 голосов
/ 04 августа 2011

Предполагая, что виновником является lograte, я бы предложил использовать функцию copytruncate вместо перезагрузки после поворота. copytruncate не является атомарным, то есть вы можете потерять журналы на пару секунд. Вы также кратко удвоите дисковое пространство, используемое этим файлом журнала. Вот некоторые детали.

/var/log/apache2/*.log {
  weekly
  missingok
  rotate 52
  compress
  delaycompress
  notifempty
  create 640 root adm
  sharedscripts
  copytruncate
  #postrotate
  # /etc/init.d/apache2 reload > /dev/null
  endscript
}
1 голос
/ 27 апреля 2010

Вы можете отправить свои журналы в программу, которая регистрирует в файл на основе даты и исключает logrotate ...

CustomLog "|/usr/local/bin/my_log_script" combined
0 голосов
/ 30 апреля 2014

Самый простой способ войти в систему без перезапуска / перезагрузки службы - использовать опцию copyontruncate. Таким образом, logrotate скопирует содержимое файла журнала в другой файл и очистит текущий файл журнала. Таким образом, служба продолжает регистрироваться в одном и том же файле, и logrotate делает свое дело. Например:

/var/log/httpd/*log {
    copyontruncate
    missingok
    notifempty
    sharedscripts
}
0 голосов
/ 09 апреля 2010

Я обнаружил, что происходит. Вот мой conf файл logrotate для httpd:

/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

Это скрипт, который делает это. Перезагрузка apache вызывает отмирание пассажирских процессов.

У кого-нибудь есть хорошие предложения, как это сделать без перезагрузки apache? Или способ перезагрузить apache, не убивая процессы пассажиров (если это возможно)?

...