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..." отправляется немедленно и принимается немедленно, но каким-то образом (только в течение этих случайных периодов) клиент не читает полностью / правильно.

0 ответов

Другие вопросы по тегам