Сейчас я использую epoll с блокирующими розетками. Буфер заполнен кажется.

то в основном я делаю MMO-сервер на C ++, который работает на Linux. Сначала он работает нормально, но через 40 секунд с 50 клиентами он полностью остановится. Когда я отлаживаю его, я обнаруживаю, что в основном последний кадр включен до того, как он перестает отвечать, это syscall (), после чего он исчезает в ядре. Как только он исчезает в ядре, он даже не возвращает значение ... это совершенно сбивает с толку.

Каждый из 50 клиентов отправляет 23 байта каждые 250 миллисекунд. Эти 23 байта затем передаются всем остальным 49 клиентам. Этот процесс начинает замедляться, а затем в конечном итоге полностью останавливается, когда ядро ​​никогда не возвращается из системного вызова для команды send (). Каковы некоторые возможные причины здесь? Это действительно сводит меня с ума!

Один вариант, который я нашел, - это алгоритм Nagles, который вызывает задержки. Я пытался переключить это, но это все еще случается однако.

Редактировать: программа застряла здесь. В частности, при отправке, которая в свою очередь вызывает syscall ()

bool EpollManager::s_send(int curFD, unsigned char buf[], int bufLen, int flag) 
//     Meant to counteract partial sends
{
    int sendRetVal = 0;
    int bytesSent = 0;
    while(bytesSent != bufLen)
    {
 print_buffer(buf, bufLen);
        sendRetVal = send(curFD, buf + bytesSent, bufLen - bytesSent, flag); 

        cout << sendRetVal << " ";
        if(sendRetVal == -1)
        {
            perror("Sending failed");
            return false;
        }
        else
            bytesSent += sendRetVal;
    }
    return true;
}

Также это метод, который вызывает s_send.

    void EpollManager::broadcast(unsigned char msg[], int bytesRead, int sender)
    {
 for(iMap = connections.begin(); iMap != connections.end(); iMap++)
 {
  if(sender != iMap->first)
  {
   if(s_send(iMap->first, msg, bytesRead, 0)) // MSG_NOSIGNAL
   {
       if(debug)
       {
                    print_buffer(msg, bytesRead);
                    cout << "sent on file descriptor " << iMap->first << '\n';
       }
   }
  }
 }
 if(connections.find(sender) != connections.end())
        connections[sender]->reset_batch();
    }

И для выяснения связей это пример unordered_map для boost. Данные, которые заполняет программа, также не являются уникальными. Он успешно транслировался на другие файловые дескрипторы, но подавлял, по крайней мере, случайный.

Ответы на вопрос(0)

Ваш ответ на вопрос