Запись в трубу зависает после нескольких тысяч запросов при тестировании с использованием ab в linux - PullRequest
0 голосов
/ 03 июня 2019

Я использую epoll и неблокирующий канал для передачи сообщений от родителя к потомку. Код работает, когда поступает небольшое количество запросов. Но когда я тестирую его с помощью команды ab в linux с n = 100000 и -c 10, я обнаруживаю зависание записи в канал, используя strace. Это будет работать, если n меньше 10000.

Я не уверен, причина. Это как-то связано с перегруженностью трубы?

Родительский процесс

while(1)
 {
   int status = -1;
   int n = epoll_wait (efd, ttlevents, MAXEVENTS, -1);

   for(int i=0;i<n;i++)
   {
     if(ttlevents[i].data.fd == *fdptr) // New Connection
     {
       while(1){
    if(acceptNewConnection(fdptr,efd) == -1)
     break;
       }
     }
     else   
     {
     char databuffer[1024];
     memset(databuffer,0,sizeof(databuffer));  
     read(ttlevents[i].data.fd,databuffer,sizeof(databuffer));
     write(temptr->pipeArr[1],databuffer,sizeof(databuffer)); //The program tends to hang in this place. Probably pipe is not being emptied fast enough so pipe is full 
         printf("Wrote to p2c : %d -> %d\n",temptr->pipeArr[0],temptr->pipeArr[1]);
     count++;
     close(ttlevents[i].data.fd); //if i want to close the connection but i haven't decided yet. Testing only remove it when done

     if((count%u) == 0)
          temptr = p2c;
         else
          temptr++;

     }//else
   }//for
 } //while

Дочерний процесс

while(1)
 {
   int status = -1;
   int n = epoll_wait (ecfd, cttlevents, MAXEVENTS, -1);

   for(int i=0;i<n;i++)
   {
     printf("%d Child -> Events Detected : %d\n",getpid(),n);
     if(cttlevents[i].data.fd == p2c->pipeArr[0]) // New Connection
     {
        char buffer[1024];
        memset(buffer,0,sizeof(buffer));  
        read(cttlevents[i].data.fd,buffer,sizeof(buffer));
        printf("Parent Said : %s, Child Process Id : %d, Pipe Id : %d\n",buffer,getpid(),c2p->pipeArr[1]);
        char strtemp[50]="WRITING TO PARENT PIPE";
        write(c2p->pipeArr[1],strtemp,sizeof(strtemp));
         }
         else
           printf("Event detected at childprocess but it is not p2c : %d",cttlevents[i].data.fd);       
       }//for
     } //while

strace также указывает на следующее предложение.

write(4, "HELLO\0", 6)                  = ? ERESTARTSYS (To be restarted if SA_RESTART is set)

Я не уверен, как именно установить SA_RESTART.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...