小樱 发表于 2024/12/5 00:11

C语言写的Linux web软件好像都有个内存泄漏的通病,比如kangle连接数占用不释放内存空间,避免进程重新申请优化

C语言写的Linux web软件好像都有个内存泄漏的通病,比如kangle连接数占用不释放内存空间,避免进程重新申请优化

还有就是kangle有没有办法释放下内存,没开缓存功能也会占用上1G的进程内存,然后甚至还跑进去swap里。反而其它web软件就很稳,同样的每秒100并发左右访问量情况下只要10-20MB内存占用,这些内存应该是内核建立TCP连接是内核吃的,而不是发生在进程上,你想办法弄个快照文件看看是什么在吃内存?弄个计时器每5分钟释放一下,或者直接用完立即释放不要积累避免内存泄漏,现在kangle就是根据访问量连接数吃了内存,然后永远不释放,这样导致1G内存的vps想开内存缓存都不好开,因为kangle自身要吃掉1G,没有空闲内存去做缓存了,还是说这是C语言通病,避免进程重新申请连接数需要的内存空间
看了下nginx也是c语言,就很稳占用内存就10M,就是有很多工作进程,所以这一定是发生在kangle上的问题吧
https://att.itzmx.com/data/attachment/forum/202412/04/182231pzvzmbvmckdkzdrk.jpg

帖子补充
C语言写的Linux内核软件好像都有个内存泄漏的通病,建立TCP后不进行垃圾回收,也就是对应正在发起和被动接收的最大历史产生的连接数峰值,可以弄个计时器每5分钟释放一下,或者直接用完立即释放不要积累避免内存泄漏
其实这个内存占用也不能说是泄漏,是为了避免后续建立连接的时候重复去申请内存空间,也算是一种常驻内存的优化技术,避免进程重新申请连接数需要的内存空间
也算是一种常驻内存的优化技术,占用最大历史产生的连接数峰值内存避免重新申请
C语言对于申请连接数默认不释放内存的,对于频繁建立连接的web软件特别有效,比如说opentracker,nginx等等,不信你把防火墙堵了端口,,,然后等用户列表变成0,你看进程内存还在那,这种做法应该是避免内存碎片,频繁申请内存空间
我觉得对于比特彗星Linux版可以加一个计时器去每5分钟释放一次,毕竟transmission之类其它BT软件都有自动释放内存
一般来说每个tcp页默认情况下申请占用100KB内存空间,tcp_rmem+tcp_wmem,在系统内核内存紧张的时候会缩小为8KB,并且上限值是tcp_mem页控制,也就是44262x100K=4.3GB内存(最紧张情况下为44262x8K=345MB),不会出现占用到1TB内存的现象

关联:https://bbs.itzmx.com/thread-106743-1-1.html

页: [1]
查看完整版本: C语言写的Linux web软件好像都有个内存泄漏的通病,比如kangle连接数占用不释放内存空间,避免进程重新申请优化