aaaaaa 发表于 2013-02-05 00:37

ATS内存管理优化已经提交社区主干分支

本帖最后由 aaaaaa 于 2013-02-05 18:33 编辑

我们已经将内存优化的代码提交到社区的master分支,即这个优化将会出现在下次发布的开发版本里:3.3.1里。这个改进主要目的是解决内存分配中的不释放问题,使用的是一个内存回收功能,相关的参数有:


* proxy.config.allocator.enable_reclaim
是否启用内存回收功能。这个参数的主要目的是让内存回收成为可以配置的功能,主要为让社区的老人们觉得新功能不是推翻重来的。代码默认目前是1,即启用回收。配置文件默认是0,即关闭回收。如是用git/master里的代码新装的配置文件会生效,即不启用。如果是从其他版本升级上来,由于records.config升级安装不会覆盖,代码默认配置会生效,即启用。这个一定要理解哦,我有可能后面再改这些默认值的。

* proxy.config.allocator.reclaim_factor
是控制回收的阈值的,0.0-1.0的浮点数,默认0.3。越高越主动回收。

* proxy.config.allocator.max_overage
定义超过阈值几次才回收,也是一个用来控制收缩算法启动的一个小开关,代码默认10。实测3效果比较好,新配置默认是3。

还有一个参数是debug用的,一般用不到
* proxy.config.allocator.debug_filter
Dump debug information according bit mask of debug_filter, if a bit is set
in the mask, then debug information of the corresponding action are dumped:
   bit 0: reclaim memory in ink_freelist_new
   bit 1: allocate memory from partial-free Chunks(if exist) or OS


如果要启用内存回收,请使用最新的git版本,从官方clone出来,带--enable-reclaimable-freelist编译,请设置proxy.config.allocator.enable_reclaim为1,并调节reclaim_facotr和max_overage到符合你的业务场景的数值。当然默认的参数也是能行的,是一个比较中庸的值。

llzqq 发表于 2013-02-05 09:56

本帖最后由 llzqq 于 2013-02-05 10:05 编辑

恩,这个今天早上git时发现了,对TS来说是个重大好消息啊!

目前还不知道这个补丁的效率怎么样,能否把TS的内存使用严格限制在设定值内,还是说比原来的内存管理有较大改善呢?

aaaaaa 发表于 2013-02-05 16:31

从我们测试结果和社区其他人反馈看,这个patch将会控制住内存使用程度。因为TS的内存主要有几个方面:
1,ram cache固定数量占用。
2,跟连接数和transaction数关联的内部结构数据占用
这两个都可以因为目前的patch在高峰占用过后,能回收回来。

FYI

happy_fish100 发表于 2013-02-05 17:49

cool!

brianchen829 发表于 2013-03-20 16:27

最近在测试这个主干分支。但只是1个小时左右ATS就重启了。报如下错误,老大帮忙看一下,是不是这个内存回收方面的问题?
using root directory '/usr'
/usr/bin/traffic_server - STACK TRACE:
/lib/libtsutil.so.3
/lib/libtsutil.so.3(reclaimable_freelist_new+0x6e8)
/lib/libtsutil.so.3(ink_freelist_new+0x1c)
/usr/bin/traffic_server
/usr/bin/traffic_server(_ZN7CacheVC10handleReadEiP5Event+0x1fd)
/usr/bin/traffic_server(_ZN7CacheVC12do_read_callEP7INK_MD5+0x7a)
/usr/bin/traffic_server(_ZN5Cache9open_readEP12ContinuationP7INK_MD5P7HTTPHdrP21CacheLookupHttpConfig13CacheFragTypePci+0x2e4)
/usr/bin/traffic_server(_ZN14CacheProcessor9open_readEP12ContinuationP3URLbP7HTTPHdrP21CacheLookupHttpConfigl13CacheFragType+0x87)
/usr/bin/traffic_server(_ZN11HttpCacheSM18do_cache_open_readEv+0x4b)
/usr/bin/traffic_server(_ZN11HttpCacheSM9open_readEP3URLP7HTTPHdrP21CacheLookupHttpConfigl+0x48)
/usr/bin/traffic_server(_ZN6HttpSM24do_cache_lookup_and_readEv+0x104)
/usr/bin/traffic_server(_ZN6HttpSM14set_next_stateEv+0x746)
/usr/bin/traffic_server(_ZN6HttpSM17handle_api_returnEv+0xe2)
/usr/bin/traffic_server(_ZN6HttpSM17state_api_calloutEiPv+0x350)
/usr/bin/traffic_server(_ZN6HttpSM23do_api_callout_internalEv+0x4f)
/usr/bin/traffic_server(_ZN6HttpSM14set_next_stateEv+0x1b3)
/usr/bin/traffic_server(_ZN6HttpSM14set_next_stateEv+0x19a)
/usr/bin/traffic_server(_ZN6HttpSM17handle_api_returnEv+0xe2)
/usr/bin/traffic_server(_ZN6HttpSM17state_api_calloutEiPv+0x350)
/usr/bin/traffic_server(_ZN6HttpSM23do_api_callout_internalEv+0x4f)
/usr/bin/traffic_server(_ZN6HttpSM14set_next_stateEv+0x1b3)
/usr/bin/traffic_server(_ZN6HttpSM17handle_api_returnEv+0xe2)
/usr/bin/traffic_server(_ZN6HttpSM17state_api_calloutEiPv+0x350)
/usr/bin/traffic_server(_ZN6HttpSM18state_api_callbackEiPv+0x72)
/usr/bin/traffic_server(TSHttpTxnReenable+0x386)
/usr/lib/cacheurl.so
/usr/bin/traffic_server(_ZN6HttpSM17state_api_calloutEiPv+0x4bb)
/usr/bin/traffic_server(_ZN6HttpSM23do_api_callout_internalEv+0x4f)
/usr/bin/traffic_server(_ZN6HttpSM14set_next_stateEv+0x1b3)
/usr/bin/traffic_server(_ZN6HttpSM32state_read_client_request_headerEiPv+0x239)
/usr/bin/traffic_server(_ZN6HttpSM12main_handlerEiPv+0x66)
/usr/bin/traffic_server
/usr/bin/traffic_server(_ZN10NetHandler12mainNetEventEiP5Event+0x258)
/usr/bin/traffic_server(_ZN7EThread13process_eventEP5Eventi+0x7d)
/usr/bin/traffic_server(_ZN7EThread7executeEv+0x46b)
/usr/bin/traffic_server
/lib/libpthread.so.0
/lib/libc.so.6(clone+0x5e)
FATAL: Failed to mmap 987136 bytes, Cannot allocate memory
/usr/bin/traffic_server - STACK TRACE:
/lib/libtsutil.so.3
/lib/libtsutil.so.3
/lib/libtsutil.so.3(reclaimable_freelist_new+0x6e8)
/lib/libtsutil.so.3(ink_freelist_new+0x1c)
/usr/bin/traffic_server
/usr/bin/traffic_server(_ZN7CacheVC10handleReadEiP5Event+0x1fd)
/usr/bin/traffic_server(_ZN7CacheVC12do_read_callEP7INK_MD5+0x7a)
/usr/bin/traffic_server(_ZN5Cache9open_readEP12ContinuationP7INK_MD5P7HTTPHdrP21CacheLookupHttpConfig13CacheFragTypePci+0x2e4)
/usr/bin/traffic_server(_ZN14CacheProcessor9open_readEP12ContinuationP3URLbP7HTTPHdrP21CacheLookupHttpConfigl13CacheFragType+0x87)
/usr/bin/traffic_server(_ZN11HttpCacheSM18do_cache_open_readEv+0x4b)
/usr/bin/traffic_server(_ZN11HttpCacheSM9open_readEP3URLP7HTTPHdrP21CacheLookupHttpConfigl+0x48)
/usr/bin/traffic_server(_ZN6HttpSM24do_cache_lookup_and_readEv+0x104)
/usr/bin/traffic_server(_ZN6HttpSM14set_next_stateEv+0x746)
/usr/bin/traffic_server(_ZN6HttpSM17handle_api_returnEv+0xe2)
/usr/bin/traffic_server(_ZN6HttpSM17state_api_calloutEiPv+0x350)
/usr/bin/traffic_server(_ZN6HttpSM23do_api_callout_internalEv+0x4f)
/usr/bin/traffic_server(_ZN6HttpSM14set_next_stateEv+0x1b3)
/usr/bin/traffic_server(_ZN6HttpSM14set_next_stateEv+0x19a)
/usr/bin/traffic_server(_ZN6HttpSM17handle_api_returnEv+0xe2)
/usr/bin/traffic_server(_ZN6HttpSM17state_api_calloutEiPv+0x350)
/usr/bin/traffic_server(_ZN6HttpSM23do_api_callout_internalEv+0x4f)
/usr/bin/traffic_server(_ZN6HttpSM14set_next_stateEv+0x1b3)
/usr/bin/traffic_server(_ZN6HttpSM17handle_api_returnEv+0xe2)
/usr/bin/traffic_server(_ZN6HttpSM17state_api_calloutEiPv+0x350)
/usr/bin/traffic_server(_ZN6HttpSM18state_api_callbackEiPv+0x72)
/usr/bin/traffic_server(TSHttpTxnReenable+0x386)
/usr/lib/cacheurl.so
/usr/bin/traffic_server(_ZN6HttpSM17state_api_calloutEiPv+0x4bb)
/usr/bin/traffic_server(_ZN6HttpSM23do_api_callout_internalEv+0x4f)
/usr/bin/traffic_server(_ZN6HttpSM14set_next_stateEv+0x1b3)
/usr/bin/traffic_server(_ZN6HttpSM32state_read_client_request_headerEiPv+0x239)
/usr/bin/traffic_server(_ZN6HttpSM12main_handlerEiPv+0x66)
/usr/bin/traffic_server
/usr/bin/traffic_server(_ZN10NetHandler12mainNetEventEiP5Event+0x258)
/usr/bin/traffic_server(_ZN7EThread13process_eventEP5Eventi+0x7d)
/usr/bin/traffic_server(_ZN7EThread7executeEv+0x46b)
/usr/bin/traffic_server
/lib/libpthread.so.0
/lib/libc.so.6(clone+0x5e)

chinainvent 发表于 2013-03-20 16:53

回复 5# brianchen829

FATAL: Failed to mmap 987136 bytes, Cannot allocate memory

从这一行来看,是因为从操作系统mmap内存时失败。

有两个原因:
1)在那一刻,你的操作系统的空闲内存,确实不够了。
2)或者真的是因为reclaimable_freelist的潜在bug(但master版本,我们在线上系统跑得很稳定)。

我觉得1)的可能性高一些,导致1)原因有很多,例如,你的cache size是不是配得不够合理(太大了)。

建议你,把ATS挂掉那一刻的操作系统空闲内存,记录下来。

另外,你的操作系统信息等,尽量详尽的收集,反馈给我们。


   

brianchen829 发表于 2013-03-20 17:16

1、操作系统用的是32位,内存16G的。编译的时候开启了pae支持,系统能识别到16G内存。
2、ram_cache试过多个值,1G、2G、3G、8G都试过,但出错的频率并没有减少。
3、内存我看了下已使用情况:最多的时候也就2.8G。在1.5G-2.3G之间波动的。

aaaaaa 发表于 2013-03-20 17:36

哈,32位系统,这个得看看

brianchen829 发表于 2013-03-24 22:41

再贴一些ATS重启时的内存信息,老大帮忙看一下。
内存状态。内存大部分被ATS占用。
% free
            total         used         free       shared      buffers
Mem:      3104496      1924024      1180472            0       412316
Swap:            0            0            0
Total:      3104496      1924024      1180472
% show:cache-stats

Bytes Used --- 269 GB
Cache Size --- 399 GB
--RAM Cache--
Total Bytes -- 1073741824
Bytes Used --- 1072705536
Hits --------- 161734
Misses ------- 128908
--Lookups--
In Progress -- 0
Hits --------- 0
Misses ------- 0
--Reads--
In Progress -- 7
Hits --------- 192226
Misses ------- 405131
--Writes--
In Progress -- 166
Hits --------- 153156
Misses ------- 11331
--Updates--
In Progress -- 5
Hits --------- 57527
Misses ------- 461
--Removes--
In Progress -- 0
Hits --------- 0
Misses ------- 0

错误输出:
using root directory '/usr'                                    
/usr/bin/traffic_server - STACK TRACE:                                       
/lib/libtsutil.so.3                                                
/lib/libtsutil.so.3(reclaimable_freelist_new+0x6e8)               
/lib/libtsutil.so.3(ink_freelist_new+0x1c)                     
/usr/bin/traffic_server                                             
/usr/bin/traffic_server(_ZN7CacheVC10handleReadEiP5Event+0x1fd)      
/usr/bin/traffic_server(_ZN7CacheVC12do_read_callEP7INK_MD5+0x7a)   
/usr/bin/traffic_server(_ZN7CacheVC12openReadMainEiP5Event+0xd86)
/usr/bin/traffic_server(_ZN7EThread13process_eventEP5Eventi+0x7d)
/usr/bin/traffic_server(_ZN7EThread7executeEv+0x62c)            
/usr/bin/traffic_server                                             
/lib/libpthread.so.0                                                
/lib/libc.so.6(clone+0x5e)                                    
FATAL: Failed to mmap 1052672 bytes, Cannot allocate memory               
/usr/bin/traffic_server - STACK TRACE:                                    
/lib/libtsutil.so.3
/lib/libtsutil.so.3                                             
/lib/libtsutil.so.3(reclaimable_freelist_new+0x6e8)               
/lib/libtsutil.so.3(ink_freelist_new+0x1c)                        
/usr/bin/traffic_server                                             
/usr/bin/traffic_server(_ZN7CacheVC10handleReadEiP5Event+0x1fd)
/usr/bin/traffic_server(_ZN7CacheVC12do_read_callEP7INK_MD5+0x7a)
/usr/bin/traffic_server(_ZN7CacheVC12openReadMainEiP5Event+0xd86)
/usr/bin/traffic_server(_ZN7EThread13process_eventEP5Eventi+0x7d)   
/usr/bin/traffic_server(_ZN7EThread7executeEv+0x62c)               
/usr/bin/traffic_server                                          
/lib/libpthread.so.0                                          
/lib/libc.so.6(clone+0x5e)                                    
using root directory '/usr'

内存回收的配置
CONFIG proxy.config.allocator.enable_reclaim INT 1
CONFIG proxy.config.allocator.reclaim_factor FLOAT 0.300000
CONFIG proxy.config.allocator.max_overage INT 3   
页: [1]
查看完整版本: ATS内存管理优化已经提交社区主干分支