system optimize
计算、存储、网络、硬件,主要是在这四个维度
首先要有一个足够准的钟,因此个机房配几个带GPS和/或原子钟primary standard的NTP服务器。
但是应该在同一个局域网的服务器之间还是存在一定的时钟差,所以要想办法做补偿(时间戳补偿,time sync, 延迟补偿)
另外网络上的延迟可以分成两大类,第一类是物理层面规则的限制,第二个是惯性延迟。
第一类很好理解,传输速度,跟距离有关
第二类跟硬件限制有关,跟网络带宽成反比,千兆网TCP有效带宽按115MB/s估算,那么发送1150字节的消息从第1个字节离开本机网卡到第1150个字节离开本机网卡至少需要 10us,这是无法降低的,因此必要的话可以减小消息长度。
找到瓶颈,如果在CPU的话,我觉得除了算法层面的优化,不如考虑怎么用缓存(哪些可以提前做?哪些可以不做?哪些可以做了然后存一段时间?)
在代码逻辑的小点上,大概能想到的
- 限制内存分配,主要是动态的
- 使用轮询,避免阻塞,尽量避免上下文切换
- 使用共享内存作为IPC的唯一方式(共享内存只有在初始化的时候有一些系统调用,之后就可以像访问正常内存一样使用了。但这个可能要找个好点的实现,因为为了数据一致要做点东西),但能用单线程实现的就用单线程。。。
- 无锁结构,找一个好点的消息队列实现
- 尽量使用缓存友好的代码,绑核心(cpu affinity),别用list这种傻逼了
- 让编译器做更多的事,放点东西到编译期,能用CRTP的就别用虚函数,尤其是hot path
- 感觉最大的瓶颈还是在网络,机房位置选好,然后考虑下openload之类的东西
- 异常问题,可以用点unsafe的代码,比如vector[] VS vector.at(),但是要保证不会出现越界
- 用好编译器提供的builtins,像是__expected,__prefetch之类。
- 注意好struct padding。也要留意在多线程情况下会出现的false sharing情况
- 了解下代码优化级别,我记得有时候不一定是优化flag大的更好
另外收集了点资料,youtube上有几个视频,感觉还不错
- Carl Cook “When a Microsecond Is an Eternity: High Performance Trading Systems in C++”
- Performance Tuning
关于写出cache frienly的代码有点文章
- Memory part 5: What programmers can do
- what is cache friendly
- Why does the order of the loops affect performance when iterating over a 2D array?
- Software optimization resources
- Cache-Friendly-Code
最后一篇好像总结的还可以
This post is licensed under CC BY 4.0 by the author.