证券行情接收调优
优化主要可以分为以下几个方向:
- 机器平台方面的调优
- 高性能网卡加速方面的调优
- 接收程序方面的调优
机器平台的调优
一般服务器的 CPU 都支持自动睿频,而服务器的 CPU 一般默认运行于 ondemand 模式,会有中断开销,睿频的时候提升下降也是有额外的开销,特别是对于一些低端 cpu 比如 C2350,C2338,N2800 这些低价独服的 CPU,影响更大。可以通过具体的命令查看当前机器的 cpu 五种工作模式以及频率
查看当前的调节器:
除了 cpu 的工作模式的调优外, 还应该注意系统的调优,通过 tuned-adm list 命令来查看目前 tuned 支持的工作模式
高性能网卡加速方面的调优
目前市面上典型的高性能网卡的供应商有 Solarflare/Mellanox/Exablaze 等
金融行业低延迟网卡选择:
- Solarflare X2522/X3522:Solarflare X2522/X3522 是 AMD 旗下 Xinlinx 的低延迟网卡
- Mellanox ConnectX-6 LX:ConnectX-6 LX 是 NVIDIA 旗下 Mellanox 的低延迟网卡
- Exablaze ExaNIC X25/X100:ExaNIC X25/X100 是 Cisco 旗下 Exablaze 公司的低延迟网卡
但从稳定性与性能以及易用性多个方面来考虑的话还是 Solarflare X2522 是比较合适的选择
在使用Solarflare网卡时如果需要获得更优的性能(在正确安装好相应的高性能驱动的前提下)还需要注意以下一些事项:
- 开启大页机制
- 采用 CPU 核的绑定方案
- 采用绑核方案时,可以把要绑的核先进行隔离;需要先测定当前网卡与 CPU 核心的亲缘性,需绑在跟网卡亲缘性好的 cpu 核心上
接受程序方面的调优
1、可以考虑对可执行文件在编译生成时添加优化选项, 比如
- gcc 优化参数优化级别
- 使用
gcc -Q --help=optimizers
命令查看开启的优化项目
2、采用内联函数:在内联函数被调用前,使用 inline 关键字修饰内联函数定义,同时在编译时打开对内联函数的优化
3、消除循环的低效率。例如需要执行多次(在循环里)但是结果不会改变的计算,可以将这类计算移动到代码前面不会被多次求值的部分
4、系统调用会导致进程从用户态切换到内核态,开销通常较大。部分系统调用可能在微秒级别或以上,尽量避免系统调用可以大幅提高我们的程序性能
5、内存初始化程序在使用 new 或者 malloc 等分配内存后,这些内存可能并未在物理内存中分配。我们可采用初始化的方式将这些内存分配到物理内存中,避免运行过程中使用这些内存时引起缺页中断
6、算术运算和浮点数乘除法或浮点运算相对于整型的加减运算,性能开销较高。我们可留意是否能将这些耗时的运算转换为整型加减或者位运算来提升性能,或者避免乘除法和浮点运算
7、在逻辑运算符 ||
和 &&
中,可以利用与短路和或断路特性,对条件进行排序。例如 ||
中更容易为真的条件放在前面,&&
中更容易为假的条件放在前面