EasyDarwin开源流媒体服务器gettimeofday性能优化(3000万/秒次优化至8000万次/秒)
来源:互联网 发布:瓶中船的制作材料淘宝 编辑:程序博客网 时间:2024/04/30 10:34
—本文由EasyDarwin开源团队成员贡献
一、问题描述
Easydarwin中大量使用gettimeofday来获取系统时间,对系统性能造成了一定的影响。我们来做个测试:
While(1){ Gettimeofday(&tv,NULL);}
每秒执行次数为约3000w次;
二、我们来看看gettimeofday函数内核实现
参见:http://blog.csdn.net/russell_tao/article/details/7185588
三、my_gettimeofday()实现
static inline int getcpuspeed_mhz(unsigned int wait_us){ u_int64_t tsc1, tsc2; struct timespec t; t.tv_sec = 0; t.tv_nsec = wait_us * 1000; rdtscll(tsc1); // If sleep failed, result is unexpected, the caller should retry if(nanosleep(&t, NULL)) return -1; rdtscll(tsc2); return (tsc2 - tsc1)/(wait_us);} int getcpuspeed(){ static int speed = -1; while(speed<100) speed = getcpuspeed_mhz(50*1000); return speed;}int my_gettimeofday(struct timeval *tv){ u_int64_t tick = 0; // TSC偏移大于这个值,就需要重新获得系统时间 static unsigned int max_ticks = 80000000; rdtscll(tick); if(walltime.tv_sec==0 || cpuspeed_mhz==0 || (tick-walltick) > max_ticks) { if(tick==0 || cpuspeed_mhz==0) { cpuspeed_mhz = getcpuspeed(); max_ticks = cpuspeed_mhz*RELOAD_TIME_US; } //printf("gettimeofday again\n"); gettimeofday(tv, NULL); memcpy(&walltime, tv, sizeof(walltime)); rdtscll(walltick); return 0; } memcpy(tv, &walltime, sizeof(walltime)); // if RELOAD_TIME_US is 1, we are in the same us, no need to adjust tv#if RELOAD_TIME_US > 1 { uint32_t t; t = ((uint32_t)tick) / cpuspeed_mhz; TIME_ADD_US(tv, t);//add 1 us }#endif return 0;}
通过休眠一段时间,然后检查cpu TSC变化,来大概估算cpu时钟频率,然后每次调用my_gettimeofday时,通过宏,rdtscll获取寄存器rdtsc寄存器的值,系统启动后cpu的tick数,当然第一次要先获取一下当前系统时间,gettimeofday。然后根据上面计算出来的cpu频率,以及获取到的cpu已经走过的tick数,计算出相对前面的gettimeofday时间的偏移,相加后得到当前系统时间。
备注:上面讲过,由于通过休眠一段时间,统计cpu tick变化的方式统计的cpu频率有一定误差,因此。Cpu tick每走过80000000重新校验一次,如果想要更高的精度,可以把这个值缩小。
四、优化后的测试效果
8000w+次每秒,性能提高了2-3倍。
在EasyDarwin上测试,通过easypusher_file推送100路,经过my_gettimeofday优化后,cpu消耗降低8%左右。
获取更多信息
邮件:support@easydarwin.org
WEB:www.EasyDarwin.org
Copyright © EasyDarwin.org 2012-2016
0 0
- EasyDarwin开源流媒体服务器gettimeofday性能优化(3000万/秒次优化至8000万次/秒)
- [转载]EasyDarwin开源流媒体服务器gettimeofday性能优化(3000万/秒次优化至8000万次/秒)
- EasyDarwin开源流媒体服务器性能优化之Work-stealing优化方案
- EasyDarwin开源流媒体服务器内存管理优化
- [转载]EasyDarwin开源流媒体服务器内存管理优化
- EasyDarwin开源流媒体服务器Work-stealing优化方案
- EasyDarwin开源流媒体服务器性能瓶颈分析及优化方案设计
- EasyDarwin开源流媒体服务器性能瓶颈分析及优化方案设计
- EasyDarwin开源流媒体服务器性能瓶颈分析及优化方案设计
- 开源流媒体服务器--EasyDarwin
- Mysql cluster (集群)7.2的性能实测(50万次/秒)
- 开源流媒体服务器EasyDarwin支持epoll网络模型,大大提升流媒体服务器网络并发性能
- 开源流媒体服务器EasyDarwin支持epoll网络模型,大大提升流媒体服务器网络并发性能
- EasyDarwin开源流媒体服务器高性能设计之无锁队列
- EasyDarwin开源流媒体项目
- vs2015编译EasyDarwin开源流媒体服务器Linux版本调研
- vs2015编译EasyDarwin开源流媒体服务器Linux版本调研
- EasyDarwin开源流媒体社区视频教程
- Linux命令——文件查找命令find
- Dr. Elephant大象医生安装文档
- c++-作业6
- OpenGL学习脚印: 二维纹理映射(2D textures)
- C++ 将String类作为包含类
- EasyDarwin开源流媒体服务器gettimeofday性能优化(3000万/秒次优化至8000万次/秒)
- 菜鸟修炼,多客户端Thread
- 约数倍数选卡片---博弈论
- JAVA设计模式(24):创建型-工厂模式【工厂方法模式】(Factory Method)
- 关于window.open被拦截那些事
- 详解交换两个数的值
- Linux系统小知识汇总
- spring-boot(5) 的logback 整理
- 快速排序