Linux 查看和设置 socket 缓冲区大小
问题背景
最近我们开发的软件在客户现场运行很容易出现丢包现象,由于我们的软件需要接收来自传感器的庞大数据量,一秒钟有数万个数据包,网络带宽可达 200 Mb/s。 然而,当我们出发去到客户现场调试时,发现软件在我们自己的设备上运行良好,而客户的设备依然丢包严重。多年的工作经验使我意识到,这可能是个系统性能问题,常见的性能瓶颈包括 CPU、内存、IO 读写等等。经过初步诊断,我们发现线程的 CPU 占用率、内存使用情况均正常,于是把焦点放在网络 IO 上,也就是说丢包很可能出现在 recv 线程上。最终,当我们在客户的设备上增大 socket 接收缓冲区大小后,丢包现象就消失了。因此,本文介绍在 Linux 系统中查看和设置 socket 缓冲区大小的方法。
查看系统值
socket 缓冲区
$ cat /proc/sys/net/core/rmem_max # 接收缓冲区最大值
10485760
$ cat /proc/sys/net/core/wmem_max # 发送缓冲区最大值
10485760
$ cat /proc/sys/net/core/rmem_default # 接收缓冲区默认值
212992
$ cat /proc/sys/net/core/wmem_default # 发送缓冲区默认值
212992
TCP 缓冲区
$ cat /proc/sys/net/ipv4/tcp_rmem
4096 131072 6291456
$ cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304
$ cat /proc/sys/net/ipv4/tcp_mem
187092 249458 374184