Почему размер буфера приема UDP (rx_queue) не увеличивается? - PullRequest
0 голосов
/ 07 ноября 2018

В моем приложении Java-сервера 1000 пакетов UDP приходят в секунду. Но мое приложение может обрабатывать только 100 пакетов / сек. Таким образом, существует около 900 пакетов UDP в секунду, которые мой сервер не может обработать.

Серверное приложение делает что-то вроде этого.

    while(true)
    {
        serverSocket.receive(receivePacket);
        process(receivePacket); // takes around 50ms to complete
        serverSocket.send(sendPacket);
    }

Насколько я понимаю, эти необработанные пакеты сохраняются в приемном буфере UDP ОС. когда этот буфер заполнится, ОС отбросит эти пакеты.

Но проблема в том, что я запускаю команду, чтобы увидеть размер моего буфера UDP.

cat /proc/net/udp

Это показывает, что в моем буфере сокета UDP ничего не хранится

 cat /proc/net/udp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode ref pointer drops             
   4: FCA9C11F:C36F 8C719AC6:0035 01 00000000:00000000 00:00000000 00000000     0        0 2983494501 2 ffff880169aff4c0 0     
   5: FCA9C11F:D3F0 8C719AC6:0035 01 00000000:00000000 00:00000000 00000000     0        0 2983494485 2 ffff8801b9bbedc0 0     
  16: 7A52BB59:007B 00000000:0000 07 00000000:00000000 00:00000000 00000000    38        0 2438608536 2 ffff8807656764c0 0     
  16: A2EE0D55:007B 00000000:0000 07 00000000:00000000 00:00000000 00000000    38        0 2438608045 2 ffff88077ccdd7c0 0     
  16: A58F466D:007B 00000000:0000 07 00000000:00000000 00:00000000 00000000    38        0 2438607809 2 ffff8801129f6240 0 

Показывает, что пакет не отбрасывается, а значения tx_queue и rx_queue равны 0. Таким образом, нет никаких пакетов, сохраненных в буфере приема UDP?

Но если я возьму tcpdump, то увижу, что большое количество пакетов, приходящих на сервер и сервер, может обработать только 10% всех этих пакетов. поэтому остальные 90% должны храниться в приемном буфере UDP.

Что я пропускаю или не понимаю?

...