只考虑单进程的性能,多进程可以弥补单进程的性能缺陷,但是一样有单进程的性能优化问题。
最初服务器的性能大约是支持800个连接,就跑到CPU100%,优化后能跑到1500连接;若码率为500kbps时,带宽从400Mbps直接上升到750Mbps,提升80%多。
有些地方还是真是值得注意,性能优化就和创造一个复杂系统一样,只要指导思想对了,指日可待。
性能优化工具最重要,靠人的感觉绝对是不准的,工具参考:http://blog.csdn.net/winlinvip/article/details/9377209
首先,先找出kernel的性能优化点,譬如gettimeofday这个函数,被调用了很多次,用来分析一些操作的时间。其实发现不用这么分析,去掉后直接提升5%。
其次,观察top的情况,看user和kernel哪个使用多,一般情况都是user。所以使用gperf对user进行性能优化。
最后,关键的user空间的性能优化,使用的工具是gperf和dot绘图工具。参考:http://blog.csdn.net/winlinvip/article/details/8605650
有时候发现每个地方优化后,这个点都能降低下来,但是就是整体还是没有效果;但是只要这些点到一定程度,这里提升4%,那里提升5%,突然性能就整体提升了。
总结一些小的性能优化点:
1. 内存拷贝:如果是流媒体服务器,一定要考虑避免内存拷贝。特别是video/audio数据,比较大,而且不会改变它的内容(流媒体服务器一般不会编码)。所以要使用引用计数来避免内存拷贝,如果使用stl-map来建立指针和引用计数的关系,性能不会提升多少;有一种折中的方案很好,把计数的头放在内存块后面;这样直接操作地址速度最快。
2.协议层优化:rtmp协议有message和chunk两个层次的stream,特别是chunk,会导致大量的对象生成和销毁。特别是边缘服务器,需要处理大量连接时,应该对发送的协议部分进行优化,直接使用地址发送到socket,而不应该拷贝内存和对象。
3.逻辑优化:gperf上也能看出,对所有单点有4%以上的可优化的地方都应该优化。譬如chunk packet,如果每次都开辟一个然后发送后都销毁,会浪费很多CPU时间,如果缓存一下,简单而且有效。
奇点的到来需要耐心,和品位。