MongoDB 如何使用内存? 为什么内存满了?( 四 )

net.ipv4.tcp_wmem = 8192  65536  16777216
net.ipv4.tcp_rmem = 8192  87380  16777216

redhat7(redhat6上并没有导出这么详细的信息) 上通过 ss -m 可以查看每个连接的buffer的信息 , 如下是一个示例 , 读写 buffer 分别占了 2357478bytes、2626560bytes , 即均在2MB左右;500个类似的连接就会占用掉 1GB 的内存;buffer 占到多大 , 取决于连接上发送/应答的数据包的大小、网络质量等 , 如果请求应答包都很小 , 这个buffer也不会涨到很大;如果包比较大 , 这个buffer就更容易涨的很大 。

tcp    ESTAB      0      0                       127.0.0.1:51601                                 127.0.0.1:personal-agent
  skmem:(r0rb2357478t0tb2626560f0w0o0bl0)  

除了协议栈上的内存开销 , 针对每个连接 , Mongod 会起一个单独的线程 , 专门负责处理这条连接上的请求 , mongod 为处理连接请求的线程配置了最大1MB的线程栈 , 通常实际使用在几十KB左右 , 通过 proc 文件系统看到这些线程栈的实际开销 。 除了处理请求的线程 , mongod 还有一系列的后台线程 , 比如主备同步、定期刷新 Journal、TTL、evict 等线程 , 默认每个线程最大

推荐阅读