Выявление количества отброшенных пакетов в сырых сокетах

/etc/init.d сценарии являются неинтерактивными, невход в систему, и они не пытаются получить доступ к X сессиям, потому что они - сервисы 1 в масштабе всей системы Системные службы, не связаны ни с каким конкретным зарегистрированным пользователем, 2, но X сессий всегда принадлежат зарегистрированному пользователю.

Если для Вашего приложения нужен контекст GUI для работы, это не должна быть системная служба. Вы не объяснили, почему этому нужно это или что это делает, но вероятно необходимо использовать ~/.xinitrc или система запуска Вашей Настольной среды, не init.

1 X приложений и вошли в систему, пользователи могут использовать системную службу, но о чем Вы говорите, наоборот.

2 Сервиса обычно связываются со своим собственным специальным пользователем, но они не зарегистрированы как таковые (и обычно такие пользователи не могут быть зарегистрированы).

3
09.06.2015, 14:09
2 ответа

Отброшенные пакеты можно увидеть из выходных данных netstat, ethtool. Для отбрасывания пакетов UDP проверьте вывод 'netstat -us' . Пакеты также отбрасываются на самом уровне сетевой карты, что можно увидеть с помощью 'ethtool -S '

Пример выходных данных:

$ netstat -us
IcmpMsg:
    InType3: 44
    InType8: 5
    InType13: 1
    InType17: 3
    InType37: 1
    OutType0: 5
    OutType3: 599
    OutType8: 4
    OutType14: 1
Udp:
    86942 packets received
    209 packets to unknown port received.
    **0 packet receive errors** <== This indicates packets dropped due to socket buffer full
    213901 packets sent
UdpLite:
IpExt:
    InOctets: 38683476091
    OutOctets: 959938111

Попробуйте использовать большее буферное пространство (SO_RCVBUF) и увеличьте общесистемный максимум с помощью управления sysctl net.core.rmem_max

На уровне сетевой карты вы также можете попробовать увеличить кольцевые буферы для обработки импульсного трафика (проверьте настройки через ethtool -g )

2
27.01.2020, 21:27

Вы можете получить общее количество полученных пакетов и количество отброшенных пакетов в вашей программе, используя опцию сокета PACKET _STATISTICS, как описано на справочной странице пакета (7 ).

#include <linux/if_packet.h>
#include <sys/socket.h>
#include <sys/types.h>

...

struct tpacket_stats lStats = {};
socklen_t lStatsLength = sizeof( lStats );
if ( getsockopt( mRawSocket, SOL_PACKET, PACKET_STATISTICS, &lStats, &lStatsLength ) == 0 )
{
    printf( "Total Packets: %u\nDropped Packets: %u\n", lStats.tp_packets, lStats.tp_drops );
}
else
{
    perror( "Failed to get network receive statistics" );
}
0
27.01.2020, 21:27

Теги

Похожие вопросы