fstat64 в прямом и незаконченном чтении
У меня есть небольшое веб-приложение, написанное на Perl, работающее mod_perl под apache. Все, что он делает - это создает сокет-соединение с сервером и ждет сообщения OK, прежде чем отправит запрос. у нас только максимум 10 детей. В случайное время чтение этого сообщения Ok не удается. Другие чтения хорошо в то же время. У меня есть это с
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..." отправляется немедленно и принимается немедленно, но каким-то образом (только в течение этих случайных периодов) клиент не читает полностью / правильно.