欢迎来到天天文库
浏览记录
ID:41849676
大小:164.11 KB
页数:6页
时间:2019-09-03
《sslvpn可伸缩内存池方案》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、问题背景:H前基于SSLVPN业务内存在高并发情况下内存使用达1G以上,且流量停下来后,内存虽然已经被SSLVPN进程释放了,但是GLIBC不能及时把内存归还给OS,是曲于OS内核对于128K以下的内存通过brk方式管理,进程释放后,会缓存在GLIBC内。而128K以上内存则通过nmap方式管理,进程释放后,会及时归还给OS。而SSLVPN业务内存很多内存基木上都采取brk方式管理,导致内存最后不能及时归还给OS。Sslvpntop-c进程占用内存问题,可以通过下述无内存泄露代码验证:#include#include#defineMEM_SPEC_MAX1
2、0000000void*g_mem[MEM_SPEC_MAX]={0};voidmain(){inti=0;for(i=1;i3、4、(i+500>MEM_SPEC_MAXJ)printff'currentmallocidxis:%d,pleasewaiting....n,i);g_mem[i]=malloc(rand()%1024);}printf(Hpressanykeytofreethememory11);getcharQ;for(i=1;i5、]=0;if(0==i%10000006、7、(i+500>MEM_SPEC_MAX))printf(Hcurrentfreeidxis:%d、pleasewaiting•….u,i);}printf(utheusedmemoryhasfreesucess,theprocesssmwillgotosleep……u);while(l){sleep(lO);查看现彖如H:程序free所有内存后,top-c看到内存还冇3.2G。而修改上面的malloc内存大小更改为1M,则最fdsleep后,内存只占用几百k。基于GLIBC的内存管理策略,我们的业务内存管理就尽量让内核的内存管理基于nmap策略8、去管理,基于此策略提供下而的内存池优化思想。通过实现用户态内存池希望完成如F口标:1)、解决用户态程序glibc基于brk方式缓存的内存长时间不归还问题(目前不采取内存池经验证也有可行的方法)。2)、提供开发可控的内存分呢,以跟踪业务内存使用情况来方便定位业务内存泄露问题。3)、基于预先创建好的内存池,避免业务使用内存时,每次需要向系统分配内存(用户态到内核态的系统调用),以提升内存分配性能。4)、尽可能减少频繁申请释放,持续长时间运行则会在glibc里产生大量的内存碎片,进而影响内存利用效率。5)、内存池实现需要考虑线程安全。6)、内存池实现尽可能简单、可复用,以lib库方式可以独立提供给业9、务使用。基于上述H标有下而几种内存池构思:1、系统初始化时,一次性分配若干数目固定大小的内存,比如一次性分配8字节内存多少个节点,16字节内存多少个节点,32字节・・・・・1024。这种思想很简单但不灵活,而且可能存在内存浪费,因就算没有大量业务时,内存也在初始化时就分配好了。2、内存池支持在内存规格范围内动态伸缩:假定某款设备内存垠多支持3000并发用户所需耍的内存为2G的话,则系统为VPN满规格时所分配的内存最多为2G。系统初始化时一次性分配10M内存(格式化为4,8,16,・・•・,10172大小的内存块),后续每10M扩充内存(格式化为4,8,16,…10172大小的内存块,可以先格式10、化一些常用的大小,可动态调整内部的小内存块,这些小内存块竞争使用)。这种内存池可用如下图來表示:基于GLIBC的内存管理策略,我们的业务内存管理就尽量让内核的内存管理基于nmap策略去管理,基于此策略提供下而的内存池优化思想。通过实现用户态内存池希望完成如F口标:1)、解决用户态程序glibc基于brk方式缓存的内存长时间不归还问题(目前不采取内存池经验证也有可行的方法)。2)、提供开发可控的内存分呢,以跟踪业务内存使用情况来方便定位业务内存泄露问题。3)、基于预先创建好的内存池,避免业务使用内存时,每次需要向系统分配内存(用户态到内核态的系统调用),以提升内存分配性能。4)、尽可能减少频繁申11、请释放,持续长时间运行则会在glibc里产生大量的内存碎片,进而影响内存利用效率。5)、内存池实现需要考虑线程安全。6)、内存池实现尽可能简单、可复用,以lib库方式可以独立提供给业务使用。基于上述H标有下而几种内存池构思:1、系统初始化时,一次性分配若干数目固定大小的内存,比如一次性分配8字节内存多少个节点,16字节内存多少个节点,32字节・・・・・1024。这种思想很简单但不灵活,而且可能存在
3、
4、(i+500>MEM_SPEC_MAXJ)printff'currentmallocidxis:%d,pleasewaiting....n,i);g_mem[i]=malloc(rand()%1024);}printf(Hpressanykeytofreethememory11);getcharQ;for(i=1;i5、]=0;if(0==i%10000006、7、(i+500>MEM_SPEC_MAX))printf(Hcurrentfreeidxis:%d、pleasewaiting•….u,i);}printf(utheusedmemoryhasfreesucess,theprocesssmwillgotosleep……u);while(l){sleep(lO);查看现彖如H:程序free所有内存后,top-c看到内存还冇3.2G。而修改上面的malloc内存大小更改为1M,则最fdsleep后,内存只占用几百k。基于GLIBC的内存管理策略,我们的业务内存管理就尽量让内核的内存管理基于nmap策略8、去管理,基于此策略提供下而的内存池优化思想。通过实现用户态内存池希望完成如F口标:1)、解决用户态程序glibc基于brk方式缓存的内存长时间不归还问题(目前不采取内存池经验证也有可行的方法)。2)、提供开发可控的内存分呢,以跟踪业务内存使用情况来方便定位业务内存泄露问题。3)、基于预先创建好的内存池,避免业务使用内存时,每次需要向系统分配内存(用户态到内核态的系统调用),以提升内存分配性能。4)、尽可能减少频繁申请释放,持续长时间运行则会在glibc里产生大量的内存碎片,进而影响内存利用效率。5)、内存池实现需要考虑线程安全。6)、内存池实现尽可能简单、可复用,以lib库方式可以独立提供给业9、务使用。基于上述H标有下而几种内存池构思:1、系统初始化时,一次性分配若干数目固定大小的内存,比如一次性分配8字节内存多少个节点,16字节内存多少个节点,32字节・・・・・1024。这种思想很简单但不灵活,而且可能存在内存浪费,因就算没有大量业务时,内存也在初始化时就分配好了。2、内存池支持在内存规格范围内动态伸缩:假定某款设备内存垠多支持3000并发用户所需耍的内存为2G的话,则系统为VPN满规格时所分配的内存最多为2G。系统初始化时一次性分配10M内存(格式化为4,8,16,・・•・,10172大小的内存块),后续每10M扩充内存(格式化为4,8,16,…10172大小的内存块,可以先格式10、化一些常用的大小,可动态调整内部的小内存块,这些小内存块竞争使用)。这种内存池可用如下图來表示:基于GLIBC的内存管理策略,我们的业务内存管理就尽量让内核的内存管理基于nmap策略去管理,基于此策略提供下而的内存池优化思想。通过实现用户态内存池希望完成如F口标:1)、解决用户态程序glibc基于brk方式缓存的内存长时间不归还问题(目前不采取内存池经验证也有可行的方法)。2)、提供开发可控的内存分呢,以跟踪业务内存使用情况来方便定位业务内存泄露问题。3)、基于预先创建好的内存池,避免业务使用内存时,每次需要向系统分配内存(用户态到内核态的系统调用),以提升内存分配性能。4)、尽可能减少频繁申11、请释放,持续长时间运行则会在glibc里产生大量的内存碎片,进而影响内存利用效率。5)、内存池实现需要考虑线程安全。6)、内存池实现尽可能简单、可复用,以lib库方式可以独立提供给业务使用。基于上述H标有下而几种内存池构思:1、系统初始化时,一次性分配若干数目固定大小的内存,比如一次性分配8字节内存多少个节点,16字节内存多少个节点,32字节・・・・・1024。这种思想很简单但不灵活,而且可能存在
5、]=0;if(0==i%1000000
6、
7、(i+500>MEM_SPEC_MAX))printf(Hcurrentfreeidxis:%d、pleasewaiting•….u,i);}printf(utheusedmemoryhasfreesucess,theprocesssmwillgotosleep……u);while(l){sleep(lO);查看现彖如H:程序free所有内存后,top-c看到内存还冇3.2G。而修改上面的malloc内存大小更改为1M,则最fdsleep后,内存只占用几百k。基于GLIBC的内存管理策略,我们的业务内存管理就尽量让内核的内存管理基于nmap策略
8、去管理,基于此策略提供下而的内存池优化思想。通过实现用户态内存池希望完成如F口标:1)、解决用户态程序glibc基于brk方式缓存的内存长时间不归还问题(目前不采取内存池经验证也有可行的方法)。2)、提供开发可控的内存分呢,以跟踪业务内存使用情况来方便定位业务内存泄露问题。3)、基于预先创建好的内存池,避免业务使用内存时,每次需要向系统分配内存(用户态到内核态的系统调用),以提升内存分配性能。4)、尽可能减少频繁申请释放,持续长时间运行则会在glibc里产生大量的内存碎片,进而影响内存利用效率。5)、内存池实现需要考虑线程安全。6)、内存池实现尽可能简单、可复用,以lib库方式可以独立提供给业
9、务使用。基于上述H标有下而几种内存池构思:1、系统初始化时,一次性分配若干数目固定大小的内存,比如一次性分配8字节内存多少个节点,16字节内存多少个节点,32字节・・・・・1024。这种思想很简单但不灵活,而且可能存在内存浪费,因就算没有大量业务时,内存也在初始化时就分配好了。2、内存池支持在内存规格范围内动态伸缩:假定某款设备内存垠多支持3000并发用户所需耍的内存为2G的话,则系统为VPN满规格时所分配的内存最多为2G。系统初始化时一次性分配10M内存(格式化为4,8,16,・・•・,10172大小的内存块),后续每10M扩充内存(格式化为4,8,16,…10172大小的内存块,可以先格式
10、化一些常用的大小,可动态调整内部的小内存块,这些小内存块竞争使用)。这种内存池可用如下图來表示:基于GLIBC的内存管理策略,我们的业务内存管理就尽量让内核的内存管理基于nmap策略去管理,基于此策略提供下而的内存池优化思想。通过实现用户态内存池希望完成如F口标:1)、解决用户态程序glibc基于brk方式缓存的内存长时间不归还问题(目前不采取内存池经验证也有可行的方法)。2)、提供开发可控的内存分呢,以跟踪业务内存使用情况来方便定位业务内存泄露问题。3)、基于预先创建好的内存池,避免业务使用内存时,每次需要向系统分配内存(用户态到内核态的系统调用),以提升内存分配性能。4)、尽可能减少频繁申
11、请释放,持续长时间运行则会在glibc里产生大量的内存碎片,进而影响内存利用效率。5)、内存池实现需要考虑线程安全。6)、内存池实现尽可能简单、可复用,以lib库方式可以独立提供给业务使用。基于上述H标有下而几种内存池构思:1、系统初始化时,一次性分配若干数目固定大小的内存,比如一次性分配8字节内存多少个节点,16字节内存多少个节点,32字节・・・・・1024。这种思想很简单但不灵活,而且可能存在
此文档下载收益归作者所有