![长时间的 TCPDUMP 捕获缓慢但肯定占用 RAM 中所有可用的内存](https://linux22.com/image/741390/%E9%95%BF%E6%97%B6%E9%97%B4%E7%9A%84%20TCPDUMP%20%E6%8D%95%E8%8E%B7%E7%BC%93%E6%85%A2%E4%BD%86%E8%82%AF%E5%AE%9A%E5%8D%A0%E7%94%A8%20RAM%20%E4%B8%AD%E6%89%80%E6%9C%89%E5%8F%AF%E7%94%A8%E7%9A%84%E5%86%85%E5%AD%98.png)
当我在我的 ubuntu 服务器上 tcpdump 网络流量时,我发现可用内存随着时间的推移而减少。
似乎捕获的内容存储在内存中。起初,我注意到这个问题是因为我将捕获的内容保存在 RAM 中的 /tmp 文件夹中。
然后我将捕获的内容存储在磁盘上,但看到了同样的问题;而且,一旦我删除磁盘上的捕获内容,RAM 内存就会被释放!
这是 tcpdump 命令
sudo tcpdump -i lo -W 300 -C 100 -s0 -w /home/user/file.pcap &
// BEFORE
free -m
total used free shared buff/cache available
Mem: 14683 3422 6709 153 4551 10745
Swap: 0 0 0
// DELETING THE CAPTURES
rm /home/user/file.pcap*
// AFTER
free -m
total used free shared buff/cache available
Mem: 14683 3399 8267 153 3016 10768
我如何确保捕获不会占用所有可用的内存?
目标是让 tcpdump 运行几天。
答案1
确定可用内存时不要看free
列;看available
。
Linux 将使用未使用的内存作为文件的缓冲区缓存,以加快对这些文件的访问速度。您正在将大量 tcpdump 数据包捕获数据写入文件系统,因此这些数据也会被缓冲在内存中。当您停止捕获过程并删除文件时,用于该文件的缓冲区缓存也会被释放。
如果系统确实需要内存(例如用于处理数据),那么缓冲区缓存也将被释放,这意味着访问文件中的数据将导致从磁盘而不是从缓冲区缓存中读取文件。
这就是为什么该available
列添加了free
和buff/cache
列以得到available
。