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

ulimit -s(一般10MB)的线程栈 , 由于这批线程数量比较固定 , 占的内存也比较可控 。

线程在处理请求时 , 需要分配临时buffer存储接受到的数据包 , 为请求建立上下文(OperationContext) , 存储中间的处理结果(如排序、aggration等)以及最终的应答结果等 。

当有大量请求并发时 , 可能会观察到 mongod 使用内存上涨 , 等请求降下来后又慢慢释放的行为 , 这个主要是 tcmalloc 内存管理策略导致的 , tcmalloc 为性能考虑 , 每个线程会有自己的 local free page cache , 还有 central free page cache;内存申请时 , 按 local thread free page cache ==> central free page cache 查找可用内存 , 找不到可用内存时才会从堆上申请;当释放内存时 , 也会归还到 cache 里 , tcmalloc 后台慢慢再归还给 OS , 默认情况下 , tcmalloc 最多会 cache min(1GB , 1/8 * system_memory) 的内存 , 通过 setParameter.tcmallocMaxTotalThreadCacheBytesParameter 参数可以配置这个值 , 不过一般不建议修改 , 尽量在访问层面做调优)

推荐阅读