fstat64 в прямом и незаконченном чтении - PullRequest
0 голосов
/ 19 сентября 2018

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

...