服务器性能疑惑

striking 2008-04-28 11:58:48
服务器里面对内存的处理 目前有2种方案

1 采用内存池 即程序一开始就分配一大块内存 做好线程同步操作等
2 需要的时候再分配 拷贝 释放

方案1 的优点是 内存重复使用 避免由于多次分配释放内存所带来的系统开销
缺点是 由于线程同步 在多线程中 可能带来线程切换的额外开销

方案2 的优点是 避免线程切换所带来的额外开销
缺点是 多次分配 释放内存会给系统带来额外的开销

现在不清楚到底是使用内存池带来的额外开销 会 大于 或小于 多次分配 释放内存所带来的额外开销


欢迎讨论 来者有分

可以分情况讨论
1. 线程多的时候 2种方案的优缺点
2. 内存大小的问题,即如果协议使用的内存很小 比如可以保证小于256字节 2种方案的优缺点
...全文
660 71 打赏 收藏 转发到动态 举报
写回复
用AI写文章
71 条回复
切换为时间正序
请发表友善的回复…
发表回复
striking 2008-05-06
  • 打赏
  • 举报
回复
先结贴 最近忙S鸟
Torch009 2008-05-02
  • 打赏
  • 举报
回复
关注。。。
僵哥 2008-05-02
  • 打赏
  • 举报
回复
[Quote=引用 60 楼 shasure520 的回复:]
内存分配释放是在进程似有地址空间发生的,跟整个系统所有线程有什么关系?如果非要说有关系,那也是物理内存到页面映射这个过程了。
看看Windows内核代码分析就知道。。
[/Quote]
我并没有说是跟整个系统,但是跟整个系统并发申请内存的线程存在着关系。进程地址空间,这只是地址表示上的问题,我说的是实际的内存分配。
huzhangyou 2008-05-02
  • 打赏
  • 举报
回复
由于在开发时候,和unsigned的项目的需求很相似,所以我比较认同他的观点。
huzhangyou 2008-05-02
  • 打赏
  • 举报
回复
引用
看了大家的讨论, 感觉基本停留在理论阶段

很多时候,没有理论的通过,就不可能有实际的行动,必须理论通过,实际才有指导的可能。

如果非要总结,对于不同的业务逻辑,肯定会有不同的要求,至于用不用内存池,也要看具体的逻辑

如果频繁的 资源开辟 以及回收 使用内存池肯定会有极大的性能改善,如果要认为线程对内存池的影响,我想 比较这个线程切换的代价 和内存资源释放开辟的代价,线程切换可以忽略不计了

如果并不需要频繁开辟释放,而业务逻辑简单,度不需要单独的线程处理,只需要由工作者线程完成,内存池就不必要了,这个时候的线程切换代码相比,内存池的锁定还有 释放 共享适用 将极其明显
poson 2008-04-30
  • 打赏
  • 举报
回复
mark
realdreamer 2008-04-30
  • 打赏
  • 举报
回复
看了大家的讨论, 感觉基本停留在理论阶段
「已注销」 2008-04-30
  • 打赏
  • 举报
回复
还有就是HeapAlloc等函数会有内核态和用户态之间的切换,这个开销不一定比线程切换的Contex Swtich小。

所以,频繁的内存分配和释放,用内存池来代替应该是很明智的。
「已注销」 2008-04-30
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 unsigned 的回复:]
引用 45 楼 shasure520 的回复:
性能:
须知:内存的分配和释放,本来就会有内核级同步。采用内存池,只是把这个工作交给了应用程序自行管理了。当然内核级同步肯定比应用程序自行同步效率高那么一点点,不过基本可以忽略(比起频繁的分配和释放来说)。

稳定:
既然你是服务器程序,那就一定要考虑稳定。频繁的分配和释放内存对稳定性是有很大影响的。对于一个健壮的系统来说,绝对要避免这样。

应用程序级同步产…
[/Quote]

内存分配释放是在进程似有地址空间发生的,跟整个系统所有线程有什么关系?如果非要说有关系,那也是物理内存到页面映射这个过程了。
看看Windows内核代码分析就知道。。
僵哥 2008-04-30
  • 打赏
  • 举报
回复
[Quote=引用 57 楼 realdreamer 的回复:]
看了大家的讨论, 感觉基本停留在理论阶段
[/Quote]
讨论本来就是基于理论,或者说对于看官来说能够得到的也仅有理论.
美丽海洋 2008-04-30
  • 打赏
  • 举报
回复
踩一印
striking 2008-04-30
  • 打赏
  • 举报
回复
这几天忙于出差的事情

等忙完 我会做个总结的
rotApple 2008-04-30
  • 打赏
  • 举报
回复
收藏.
auly403 2008-04-30
  • 打赏
  • 举报
回复
期望LZ 在结贴后能够总结一下讨论
ERR0RC0DE 2008-04-29
  • 打赏
  • 举报
回复
内存池的分配和释放内存需要开销?
我写的是VirtualAlloc一大块内存,然后压空闲内存栈,分配就是空闲内存栈上取一块,释放就是将内存再压栈,好像不需要啥开销吧。

当然我的内存块是定长的block不是变长的。栈的push,pop空间长度也计算好,基本上就是几个赋值操作。我想这速度肯定比new, delete快吧。
另:多线程中,我是为一个线程分配一个内存池实例,线程停止则回收实例。
urakvv7 2008-04-29
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 striking 的回复:]
回答很精彩

说说laiyiling提供的那篇文章http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html

看了laiyiling提供的那篇文章

讲述单线程下使用内存池比需要内存的时候申请不需要回归系统的方案 可以获得性能上的提升

但是 我详细看了那篇文章 对于其提供的内存池方案并不是最优的

我分析一下

它采用链表管理各个内存块(Memoryblock),

MemoryBlock->MemoryBlock->..........->Memor…
[/Quote]
僵哥 2008-04-29
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 danscort2000 的回复:]
内存池的本意
[1]减少内存释放的开销 -》因为分配的时候同样要计算BLOCK,因此和NEW分配不会有明显差距,除非是正好一个BLOCK长度
[2]避免内存碎片问题

我以前的帖子里也有内存池的讨论,如果是服务器程序而且是面队不稳定连接频率的服务,建议使用内存池
关于开销方面我以前的帖子里也有实验数据,在NEW的时候基本和直接从操作系统NEW打平或者慢一点[因为操作系统是虚拟分配,而我的内存池是实分配,因此。。。],但是…
[/Quote]
内存池达到的目的,其中在开分配/释放的开销上面,并不能有非常明显的优势。但是对于应用程序,特别是作用长时间服务的应用,那么更需要的是一个稳定的内存资源环境,使用内存池,可以达到一个最基本的目的就是“抢占内存”,当然这种“抢”在实际的应用当中相对不太多见,毕竟对于用户来说这是已知的,也就是说我们可以认为用户一定会留给相当的资源给这个应用运行,但也并不能排除另外一种情况,特别是当在同一机器当中的其它附属特别是辅助应用存在缺陷,而导致非预期的内存占用时,这个“内存抢占”就可以在一定条件内,使得本应用所受到的影响更小。这是其一。
其二,内存池如上面回贴所述,可以降低碎内存池分片所带来的内存碎片的产生。
其三,内存池可以使得内存达到专用,这个的好处并不会太过明显,只有特定环境下才具有一定意义。
其四,对于某些特殊的应用,对于内存的预分配,可以达到对服务能力的一个整体评估,从而可以辅助设计人员进行资源的调配。
僵哥 2008-04-29
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 scq2099yt 的回复:]
个人认为哪种方案系统开销小,应该视具体情况而定。

线程多的时候应该是第一种要好一点;
如果协议使用的内存小的时候第二种应该好一点。
[/Quote]
协议所使用的内存小,那么就是比较零散,时间长就容易产生碎片,所以更多的时候,应该是反过来,当内存分片比较小的时候,更应该使用内存池,以减少内存碎片的产生,从而保障长时间的稳定运行,对于大内存,完全可以设计按页对齐分配,基本上不会产生内存碎片。再则,对于服务器,越是需要小的内存分片,那么说明它需要的内存分片数量就越多,这种分配/释放的操作也就越频繁,那么更加有必要使用内存池。
striking 2008-04-29
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 laiyiling 的回复:]
引用 38 楼 striking 的回复:

2. 那篇文章好像不是什么基于对象的啊 莫非有玄机



搜索SLOB算法吧!很多大型的应用程序都使用了这个算法
[/Quote]


是。。。。。。。。。。
Kudeet 2008-04-29
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 striking 的回复:]

2. 那篇文章好像不是什么基于对象的啊 莫非有玄机

[/Quote]

搜索SLOB算法吧!很多大型的应用程序都使用了这个算法
加载更多回复(50)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧