Linux 用于在内核空间捕获数据包的缓冲区大小?
浏览tcpdump的手册页 如果缓冲区已满,内核似乎可以丢弃数据包。 我想知道 1) 该大小是可配置的和/或 2) 我在哪里可以看到发行版的大小 从手册页(便于参考): packets`` dropped by kernel'(如果操作系统向应用程序报告该信息,则由于缺少缓冲区空间,运行tcpdump的操作系统中的数据包捕获机制丢弃的数据包数;如果操作系统未向应用程序报告该信息,则报告为0).1)它是可配置的,但并不完全是根据您的要求决定合适的大小 2) 使用Linux 用于在内核空间捕获数据包的缓冲区大小?,linux,unix,networking,network-programming,linux-kernel,Linux,Unix,Networking,Network Programming,Linux Kernel,浏览tcpdump的手册页 如果缓冲区已满,内核似乎可以丢弃数据包。 我想知道 1) 该大小是可配置的和/或 2) 我在哪里可以看到发行版的大小 从手册页(便于参考): packets`` dropped by kernel'(如果操作系统向应用程序报告该信息,则由于缺少缓冲区空间,运行tcpdump的操作系统中的数据包捕获机制丢弃的数据包数;如果操作系统未向应用程序报告该信息,则报告为0).1)它是可配置的,但并不完全是根据您的要求决定合适的大小 2) 使用setsockopt/getsock
setsockopt/getsockopt
和SO\u RCVBUF/SO\u SNDBUF
我不熟悉linux,但这个链接似乎很好地解释了这一点。
您可以检查几个方面来缓解内核丢弃的数据包:
- 查看配置
和/proc/sys/net/core/netdev_max_backlog
。违约率可能相当低;尝试将每个设置为2000左右/proc/sys/net/core/netdev_budget
- 写入输出设备屏幕可能会阻塞/减慢
进程,时间足以填满recv缓冲区tcpdump
- 使用
关闭DNS查找和端口命名-nn
- 写入文件而不是屏幕
- 尝试一种工具,例如
- 使用
- 如果您有一台多处理器机器,请查看如何使用
taskset
- 使用
设置流程的优先级nice
即使有了这些设置,也可能只是您无法跟上您试图捕获的流量的速度。查看NIC和机器的详细信息,确保您的期望是可能的。谢谢您的回答。我尝试了你的建议,得到的答案大约是48kb。这似乎不对。它是套接字缓冲区的大小,而不是内核用于接收数据包的缓冲区大小。谢谢你的辛勤工作。修改/proc/sys/net/core/netdev_max_backlog为我做到了这一点。这里的离题问题如果您碰巧看到这条评论,为什么在unix中写入文件要比写入屏幕快/好,而在unix中这两种文件实际上都是文件?我不是专家,但我想这可以归结为两种情况下都可以使用的缓冲技术。我相信如果你问一个正式的问题,你会得到一个更明确的答案;)我可以问一个正式的问题,但我需要确保情况确实如此。您目前是否有任何第一手经验/案例研究,您在哪里观察到了这一点?我真的很想知道答案,如果写入文件而不是屏幕更快。感谢您抽出时间回答我的问题。这将非常依赖于输出设备。使用
gnome终端
vsaterm
在我的机器上快速运行,设置为在大量下载时捕获100000个数据包:gnome终端
(到文件):20丢弃gnome终端
(到屏幕):27217丢弃aterm
(到文件):0丢弃aterm
(到屏幕):0dropped@Anon:ezpz是对的,写入文件可能比写入屏幕快得多。写入“屏幕”实际上意味着写入PTY,PTY的缓冲区大小非常有限。如果PTY另一侧的显示程序读取速度不够快,则该缓冲区将填满,并且对PTY的写入将开始阻塞。大多数显示程序都比磁盘慢(磁盘也有更大的缓冲区)。