2016-01-08 1 views
1

Когда я проверить веб-сервер mod_status/сервер-статус, я заметил, что там куча нитей в состоянии ..reading ..Apache потоков не останавливается в состоянии ..reading .. до http.conf значение TimeOut достигается

Выполнение Трассирование на нитку это то, что на самом деле происходит, когда поток находится в ..reading ..

... 
... 
semop(327681, {{0, 1, SEM_UNDO}}, 1) = 0  
gettimeofday({1452260985, 867058}, NULL) = 0 
getsockname(156, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("172.31.9.248")}, [16]) = 0 
fcntl(156, F_GETFL)      = 0x2 (flags O_RDWR) 
fcntl(156, F_SETFL, O_RDWR|O_NONBLOCK) = 0 
gettimeofday({1452260985, 867479}, NULL) = 0 
read(156, 0x558f4c26e9d8, 8000)   = -1 EAGAIN (Resource temporarily unavailable) 
poll([{fd=156, events=POLLIN}], 1, 300000) = 1 ([{fd=156, revents=POLLIN}]) 
read(156, "", 8000)      = 0 
gettimeofday({1452261254, 669634}, NULL) = 0 
gettimeofday({1452261254, 669691}, NULL) = 0 
shutdown(156, SHUT_WR)     = 0 
poll([{fd=156, events=POLLIN}], 1, 2000) = 1 ([{fd=156, revents=POLLIN|POLLHUP}]) 
read(156, "", 512)      = 0 
close(156)        = 0 
read(6, 0x7fff901f67e7, 1)    = -1 EAGAIN (Resource temporarily unavailable) 
gettimeofday({1452261254, 670341}, NULL) = 0  
semop(327681, {{0, -1, SEM_UNDO}}, 1) = 0 
... 
... 

когда нить в ..waiting .. Трассирование останавливается на следующей строке:

poll([{fd=156, events=POLLIN}], 1, 300000) = 1 ([{fd=156, revents=POLLIN}]) 

Значение конфигурации apache для «Timout» в этом случае равно 30, что отражает значение «300000». Это ожидаемое значение таймаута, опускающее значение конфигурации, изменит значение, показанное выше, и это сделает тайм-аут быстрее.

Из моих новых знаний в использовании strace мне кажется, что он пытается получить сокет для поиска внутреннего IP-адреса. Но это не удается. Настройка «HostnameLookups» отключена.

Проверка нашей производственной среды показывает, что она имеет одинаковые шаблоны, когда Apache останавливается в .reading .., но затем он показывает шаблон адреса IPV6.

Пример:

getsockname(154, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::ffff:172.31.3.239", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0 

И затем останавливается на "опроса", а затем получить "(Тайм-аут)", как в приведенном выше примере.

Но есть ли какой-то вход, почему он останавливается .. ожидание ..?

Осталось ли сообщение «Ресурс временно недоступным»?

Если это имеет значение, Apache работает на экземплярах EC2 позади ELB в облаке Amazon.

Обновление: Вот изображение того, как производственный сервер смотрит прямо сейчас с состояниями потоков. Много .. .. Image of Apache thread states

Мы также запускаем большое количество VirtualHosts на серверах, если это дает нам понять, почему это происходит.

Ближайший поток на World Wide Web I фонд с той же проблемой, это одна: http://apache-http-server.18135.x6.nabble.com/Apache-Hangs-Server-Status-shows-all-Reading-td4751342.html

ответ

1

Нити, застрявшие в .reading .. были вызваны несоответствием «Idle Timeout» в настройках соединения в ELB по сравнению с настройкой Keepalivetimout в http.conf

Таймаут соединения, установленный в ELB, был намного дольше, чем Keepalivetimout, установленный в конфигурации Apache. Это приводит к тому, что Elastic Load Balancer будет пытаться поддерживать открытые соединения, пока Apache хочет закрыть его. Смотрите здесь http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/config-idle-timeout.html

После изменения настроек УДРА в соответствии с настройками в Apache конфигурации (60 секунд в настоящее время) дает результат, что я не получил длинный список нитей застревает в состоянии R (Reading). Теперь они установлены в состояние K (Keep alive). И это больше похоже на ожидаемое поведение потоков.

0

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

Но есть ли какой-то вход, почему он останавливается .. ожидание ..?

Внесенных изменений нет. Вот почему он блокирует.

+0

Удивительно, но в чем же причина, которая должна быть исправлена. Я знаю, что он пытается найти какой-то IP-адрес, но что не отвечает. И кто спрашивает, можно ли отключиться. То есть этот вызов действительно необходим. Как упоминалось выше, HostnameLookups отключены. Что еще тогда делает то же самое? – JoGi

+0

А, см. Приведенную выше проблему предложения. Предложение должно быть больше похоже на: «Может ли кто-нибудь помочь мне, почему он останавливается .. ожидание ..» :) – JoGi

+0

Коренной причиной чего? Это реализация таймаута чтения. Здесь нет никаких проблем. – EJP