小编Bal*_*ala的帖子

UDP数据包丢弃 - INErrors Vs .RcvbufErrors

我写了一个简单的UDP服务器程序,以了解更多可能的网络瓶颈.

UDP服务器:创建UDP套接字,将其绑定到指定的端口和地址,并将套接字文件描述符添加到epoll兴趣列表.然后它的epoll等待传入的数据包.收到传入数据包(EPOLLIN)后,它会读取数据包并只打印接收到的数据包长度.很简单,对:)

UDP客户端:我使用了hping,如下所示:

hping3 192.168.1.2 --udp -p 9996 --flood -d 100

当我以每秒100个数据包发送udp数据包时,我没有发现任何UDP数据包丢失.但是当我泛洪udp数据包时(如上面的命令所示),我看到了重要的数据包丢失.

测试1: 当从UDP客户端泛洪26356个数据包时,我的示例程序仅接收12127个数据包,剩余的14230个数据包被内核丢弃,如/ proc/net/snmp输出所示.

cat/proc/net/snmp | grep Udp:
Udp:InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors
Udp:12372 0 14230 218 14230 0

对于Test1,丢包率为~53%.

我确认在客户端和服务器端使用"ethtool -S ethX"命令在硬件级别上没有太多损失,而在应用程序级别,我看到如上所述损失53%.

因此,为了减少数据包丢失,我尝试了以下方法:
- 使用命令提高了示例程序的优先级.
- 增加接收缓冲区大小(在系统级和进程级)

将优先级提高到-20:

renice -20 2022
2022(进程ID)旧优先级0,新优先级-20

将接收缓冲区大小增加到16MB:

在Process Level:
int sockbufsize = 16777216;
setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,(char*)&sockbufsize,(int)sizeof(sockbufsize))
在内核级别:
cat/proc/sys/net/core/rmem_default
16777216
cat/proc/sys/net/core/rmem_max
16777216

完成这些更改后,执行Test2.

测试2: 当1985076数据包从UDP客户端泛洪时,我的示例程序接收到1848791个数据包,剩余的136286数据包被内核丢弃,如/ proc/net/snmp输出所示.

cat/proc/net/snmp | grep Udp:
Udp:InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors
Udp:1849064 0 136286 236 0 0 …

linux udp epoll linux-kernel

20
推荐指数
2
解决办法
1万
查看次数

R_X86_64_IRELATIV 是什么意思?

我通过静态链接 libc 库在 x86 arch 中为一个简单的程序构建了一个可执行文件。正如预期的那样,该可执行文件的重定位表为空:

$ readelf -r 测试
此文件中没有重定位。
$

当我通过静态链接 libc 库为同一程序构建可执行文件时,在 x86_64 arch 中,重定位表不为空:

$ readelf -r 测试

偏移量 0x1d8 处的重定位节“.rela.plt”包含 12 个条目:

  偏移信息类型符号。价值符号。名称 + 加数
0000006c2058 000000000025 R_X86_64_IRELATIV 000000000042de70
0000006c2050 000000000025 R_X86_64_IRELATIV 00000000004829d0
0000006c2048 000000000025 R_X86_64_IRELATIV 000000000042dfe0
0000006c2040 000000000025 R_X86_64_IRELATIV 000000000040a330
0000006c2038 000000000025 R_X86_64_IRELATIV 0000000000432520
0000006c2030 000000000025 R_X86_64_IRELATIV 0000000000409ef0
0000006c2028 000000000025 R_X86_64_IRELATIV 0000000000445ca0
0000006c2020 000000000025 R_X86_64_IRELATIV 0000000000437f40
0000006c2018 000000000025 R_X86_64_IRELATIV 00000000004323b0
0000006c2010 000000000025 R_X86_64_IRELATIV 0000000000430540
0000006c2008 000000000025 R_X86_64_IRELATIV 0000000000430210
0000006c2000 000000000025 R_X86_64_IRELATIV 0000000000432400
$

我在谷歌上搜索了重定位类型“R_X86_64_IRELATIV”,但我可以找到有关它的任何信息。那么有人可以告诉我这是什么意思吗? …

x86 linker x86-64 elf loader

4
推荐指数
1
解决办法
1489
查看次数

标签 统计

elf ×1

epoll ×1

linker ×1

linux ×1

linux-kernel ×1

loader ×1

udp ×1

x86 ×1

x86-64 ×1