skynet默认使用了jemalloc作为内存管理模块,但这并非必须,jemalloc能带来多大好处也和实际应用有关.是否连接jemalloc参考Build
skynet实现了一个和jemalloc物管的memory hook,用来做服务占用内存的统计,可以用来在C层面分析是否有内存泄露.
它的原理是为每个工作线程分配一个TLS区,在worker处理服务的消息前,先设置当前服务的地址,这样在内存分配发送时就要可以知道是由哪个服务分配的内存,这又易点点开销(每块内存多了几个字节,且有一些额外的运行开销),如果你计较它,可以关闭.
通常我们不太需要这个统计,因为大部分服务是用lua编写的,可以通过DebugConsole向lua服务索要内存使用情况.它主要用于自己编写的lua C扩展库的统计.统计接口被封装为一个叫做memory的库供lua调用.或者你可以直接启动cmemory这个lua服务来输出统计信息.
注: 在1.0 beta之后,对于lua服务使用的默认分配器不再hook统计内存开销,它只统计C模块中的内存使用.如果你想修改这个行为,可以阅读
https://github.com/cloudwu/skynet/blob/master/skynet-src/malloc_hook.c
参考: https://github.com/cloudwu/skynet/blob/master/service/cmemory.lua
本文介绍了Skynet如何利用MemoryHook进行内存统计,特别是针对服务占用内存的监测。MemoryHook通过为每个工作线程分配TLS区,在处理服务消息前记录服务地址,以此追踪内存分配来源。虽然引入了一定的开销,但主要适用于C扩展库的内存泄露分析。默认情况下,lua服务的内存使用不被hook,仅统计C模块内存。用户可以通过lua服务`cmemory`获取统计信息,或者参考源码进行自定义配置。

2014

被折叠的 条评论
为什么被折叠?



