2010-04-08 5 views
3

Я установил PassengerPoolIdleTime на 0, с ожиданием, что это означает, что я могу «разогревать» кучу пассажирских процессов на моем сервере, а в следующий раз, когда у меня есть пакет трафика (даже если это будет несколько дней спустя), все они будут разогреты и готовы принять запросы.Пассажирские процессы перезапускаются, несмотря на то, что 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 для корня и апача, чтобы увидеть, есть ли что-то вызывая перезапуск Apache, но я не вижу его.

Вот отрывок из passenger-status, примерно 11 часов и 46minutes после полуночи:

----------- 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).

+0

Является ли это единственным приложением для пассажиров? Даже при настройке 0 они будут отключены, если в другом приложении необходимы процессы. Также проверьте измененное время файла restart.txt, если что-то коснется этого, оно перезапустится. – danivovich

+0

Да, это единственное приложение для пассажиров. Хорошая идея проверить файл restart.txt, но он не был затронут с 26 марта ... – bantic

ответ

0

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

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

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

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

+0

Вы получили ответ на этот вопрос? – Crashalot

1

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

CustomLog "|/usr/local/bin/my_log_script" combined 
+0

О, это крутая идея. – bantic

3

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

/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 
} 
0

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

/var/log/httpd/*log { 
    copyontruncate 
    missingok 
    notifempty 
    sharedscripts 
}