У меня есть небольшое веб-приложение, написанное на Perl, которое запускает mod_perl под apache.Все, что он делает - это создает сокет-соединение с сервером и ждет сообщения OK, прежде чем отправит запрос.у нас только максимум 10 детей.В случайное время чтение этого сообщения Ok не удается.Другие чтения хорошо в то же время.У меня есть strace'd с
sudo strace -x -o traceout.log -f -tt -s 1024 -p 23735
нормальные чтения имеют:
31317 14:27:18.043630 alarm(30) = 0
31317 14:27:18.043722 read(17, "OK nGSrv ready. $Revision: 1.59 $ Built: May 5 2017 11:17:19 - [1]\r\n", 4096) = 70
31317 14:27:18.043811 alarm(0) = 30
, но сбои имеют:
31198 14:26:34.350791 alarm(30) = 0
31198 14:26:34.350836 fstat64(16, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0
31198 14:26:34.350934 read(16, "OK nGSrv ready. $Revision: 1.59 $ Built: May 5 2017 11:17:19 - [3]\r\n", 4096) = 70
31198 14:26:34.351014 read(16, <unfinished ...>
:
:
31198 14:26:39.345766 <... read resumed> "", 4096) = 0
31198 14:26:39.345829 alarm(0) = 25
5-секундный аварийный сигнал / тайм-аутдругой конец закрывает соединение, так как он не получил запрос.
Кто-нибудь знает, почему у сбоев есть этот дополнительный fstat64 и незавершенное чтение?
$server = IO::Socket::INET->new(Proto => "tcp",
PeerAddr => $ip,
PeerPort => $port,
Timeout => $timeout);
if( $server ) {
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # \n required!!!!
alarm $queuetimeout;
$greeting = <$server>;
alarm 0;
};
if($@) { # Something in the eval died
unless( $@ eq "alarm\n" ) {
# Unexpected Error
$greeting = 'ERROR'; # Force an ERROR response
} else {
# Timeout
$greeting = 'BUSY'; # Force a BUSY response
}
}
Строка с дополнительным значением fstat64 и незавершенным чтением: -
$greeting = <$server>;
Это работает нормально, пока какое-то случайное событие не приводит к сбою 1 из 10, для случайногопериод времени, затем они останавливаются.Это затрагивает 6 веб-серверов в одной сети с общими подключениями и общей БД.Единственное отличие, которое мы можем найти - это fstat64.Эти 6 веб-серверов (apache, mod_perl) подключаются к одному из 2 других серверов также в той же сети.Мы tcpdump'или оба сервера и видим, что сообщение «OK nGSrv ready ...» отправляется немедленно и принимается немедленно, но каким-то образом (только в течение этих случайных периодов) клиент не читает полностью / правильно.