【研究报告】非极速模式性能测试及结果分析
xinze/核心开发
测试背景:
现阶段各进程均使用极速模式运行,通常一个进程实例独占一个CPU核心来获得更好的性能与延迟表现,此应用场景对CPU等资源有非常高的要求。预期实现的目标是一台机器可以容纳更多策略实例的同时保持较高性能表现。
据此在特定机器上进行模拟,测量并分析延迟表现,探索降低延迟时间开销的方法。预期场景为所有进程均使用非极速模式,通过修改行情记录生成频率实现不同测试场景切换。
测试结论:
1 .由于策略实例数量为80,外加6个平台进程,总计86个进程,而机器核心数量为12,进程数量大于CPU核心数就一定会存在CPU资源的争抢以及上下文切换带来的开销。
2 .使用绑核可有效降低各步骤以及整体的开销,例如:绑核前A10、B10场景的t2o总开销时间可达数ms至数十ms,绑核之后对应场景C10、D10的t2o总开销降低至数百us。
3 .绑核操作可有效减少传输时间开销与CPU缓存一致性机制的开销变化有关。绑核之后,写进程更新后需要完成的缓存失效、缓存刷新、消息传递等写传播相关步骤可更快完成:绑核后写进程更有可能独占该核心的缓存,在写操作执行完之后,其他进程在读取共享内存时,可以直接从该核心的缓存中获取最新的数据,而无需通过缓存一致性协议的开销。写传播时间开销减小。
4 .绑核场景中,随着行情频率的变化,总开销呈M型:总体行情频率为1笔/s和2笔/s附近(对应C4、C5,D4、D5)以及8000笔/s附近(对应A12、B12、C12、D12)t2o总开销时间较高,而更高或更低总体行情频率的t2o总开销时间较低(可对应比较C1、C10,D1、D10)。
5 .不绑核场景中,t2o总开销的峰值场景之一为A10、B10对应总行情频率较高,此场景触发了频繁的上下文切换以及缓存同步。A11、B11因为行情密度较为适宜减少了上下文切换频率。A12、B12处于另外一处t2o总开销峰值更多因素是行情记录密度太高CPU处理资源瓶颈处理不过来。
6 .策略实例不再与md和td进程进行CPU资源争抢,可极大提高整体延迟的表现。
7 .在C10和D10场景中,跨numa节点的共享内存访问开销远小于策略实例争抢CPU资源带来的开销。(包括策略实例之间的竞争以及策略实例与平台进程之间的竞争)
8 .平台进程采用极速模式而策略实例使用非极速模式的混用场景中,订单传输开销与全采用极速模式下接近但是行情记录传输开销在50ms左右,这是因为极速模式在更新完共享内存记录后什么都不做,此时策略只能等到100ms超时结束后去读行情记录的更新,均匀分布的数学期望为50ms与实测表现一致。因此现有通知机制下不建议极速模式与非极速模式混用。
使用建议:
1 .对平台进程进行绑核操作。
2. 绑核配合大页内存使用有进一步提升。
3 .平台进程隔核运行或者绑核时策略实例与平台进程的核心范围不重合。
4. 依据预期的行情频率情况以及策略行为的开销,选择机器运行的策略实例数量。
5 .可根据实际策略实例所需CPU资源以及行情频率等,分组对策略实例进行绑核操作。
6 .不建议极速模式与非极速模式混用。
测试思路:
对任务分析之后,首先探索了只有一个策略实例情况下不同行情频率的延迟表现,之后探索了非极速模式与极速模式混用的延迟表现并分析原因。接下来测试了A组作为比较基准,同时测试了所有进程采用极速模式情况对应场景下的表现。经过分析并结合之前探索极速模式下延迟表现影响因素,以及本次探索中进程数量多大于CPU核心数的特征,得出影响因素并进一步测试各影响因素在各场景下的权重。
最早预期是测试100个策略实例运行场景的延迟表现,但实测发现预留大页内存场景安全监控等第三方进程会随着策略实例创建而增加内存占用,导致超出物理内存范围并使用SWAP空间。故降低测试中实例数量为80,以避免SWAP切换引入不稳定干扰影响表现。
同时,统一缩小各类型进程journal的size避免运行过程中物理内存不足的情况发生影响测试结果的准确性。
md创建不同的线程生产不同标的行情记录,80个标的对应80个线程。通过不同线程创建时间间隔以及同线程内行情记录生成间隔,来控制总体行情记录的生成频率以及各标的行情记录的生成频率。上述间隔以及行情记录条数通过启动时读取的配置文件设置。
策略获取-n参数过滤对应标的行情记录,因此80个策略实例会对一条行情记录更新有响应,最终只有一个策略实例会生成有效报单给td。
kungfu-core版本:
基于2.6.0-alpha.6版本进行测试。
测试机器及配置:
测试机器为31和32,31上测试开启20G大页的场景,32上测试未开启大页的场景。两台机器配置相同,均为Intel Xeon E5-2643 3.6GHz 12核心CPU以及32G内存。
行情记录来源:
行情源使用sim生成,80个标的各由一个线程生成,通过启动时配置的JSON文件中的字段控制行情记录生成次数、同一线程内行情记录生成间隔、不同线程创建的间隔来完成各实验场景的构建。通过行情记录触发策略下单完成全流程步骤。
策略实例启动方式、数量及行为:
使用非极速模式启动所有进程,其中间隔1s启动共计创建80个策略实例,每个实例过滤唯一感兴趣标的的行情记录,即一条行情记录只会使得一个策略生成有效报单。
测试结果说明:
由于每场测试结果的均值在一定范围内波动,故使用范围来表示测试结果。
测试场景及测试结果:
依据是否绑核以及是否开启大页共分为四大组测试A、B、C、D。
A:不绑核 + 不使用大页内存。(在机器32上测试)
序号 | 场景 | 订单传输开销 | 行情记录传输开销 | t2o总开销 |
A1 | 总体0.2笔/s,单标的行情记录间隔400s | 417.38us ~ 479.45us | 446.81us ~ 489.28us | 917.80us ~ 1016.59us |
A2 | 总体0.333笔/s,单标的行情记录间隔240s | 435.25us ~ 452.81us | 443.82us ~ 499.85us | 926.26us ~ 1001.71us |
A3 | 总体0.5笔/s,单标的行情记录间隔160s | 428.86us ~ 448.04us | 444.53us ~ 482.50us | 922.73us ~ 958.58us |
A4 | 总体1笔/s,单标的行情记录间隔80s | 529.36us ~ 906.20us | 438.39us ~ 495.80us | 1014.93us ~ 1397.09us |
A5 | 总体2笔/s,单标的行情记录间隔40s | 492.98us ~ 621.38us | 418.62us ~ 425.92us | 945.70us ~ 1074.88us |
A6 | 总体4笔/s,单标的行情记录间隔20s | 372.32us ~ 713.26us | 394.97us ~ 401.55us | 805.91us ~ 1140.76us |
A7 | 总体8笔/s,单标的行情记录间隔10s | 617.36us ~ 694.51us | 386.71us ~ 396.27us | 1040.50us ~ 1104.32us |
A8 | 总体16笔/s,单标的行情记录间隔5s | 391.61us ~ 569.36us | 366.90us ~ 375.26us | 786.95us ~ 953.03us |
A9 | 总体32笔/s,单标的行情记录间隔2.5s | 391.34us ~ 465.51us | 351.90us ~ 365.80us | 763.37us ~ 850.51us |
A10 | 总体80笔/s,单标的行情记录间隔1s | 1532.93us ~ 4558.28us | 1158.06us ~ 2790.56us | 4928.12us ~ 37814.85us |
A11 | 总体800笔/s,单标的行情记录间隔0.1s | 399.89us ~ 542.72us | 349.89us ~ 383.83us | 802.86us ~ 915.01us |
A12 | 总体8000笔/s,单标的行情记录间隔0.01s | 870.63us ~ 1058.23us | 625.83us ~ 801.14us | 1517.02us ~ 1875.96us |
B:不绑核 + 使用大页内存。(在机器31上测试,预留大页内存20G)
序号 | 场景 | 订单传输开销 | 行情记录传输开销 | t2o总开销 |
B1 | 总体0.2笔/s,单标的行情记录间隔400s | 410.89us ~ 454.58us | 434.09us ~ 453.31us | 865.39us ~ 924.75us |
B2 | 总体0.333笔/s,单标的行情记录间隔240s | 425.28us ~ 433.45us | 434.05us ~ 440.13us | 881.92us ~ 894.60us |
B3 | 总体0.5笔/s,单标的行情记录间隔160s | 418.41us ~ 438.94us | 432.95us ~ 474.27us | 880.80us ~ 916.23us |
B4 | 总体1笔/s,单标的行情记录间隔80s | 488.23us ~ 657.66us | 429.90us ~ 437.96us | 941.82us ~ 1203.52us |
B5 | 总体2笔/s,单标的行情记录间隔40s | 561.79us ~ 686.93us | 397.84us ~ 407.42us | 981.09us ~ 1106.73us |
B6 | 总体4笔/s,单标的行情记录间隔20s | 471.56us ~ 611.61us | 384.69us ~ 390.30us | 874.39us ~ 1013.11us |
B7 | 总体8笔/s,单标的行情记录间隔10s | 568.44us ~ 683.80us | 375.61us ~ 390.53us | 955.88us ~ 1085.85us |
B8 | 总体16笔/s,单标的行情记录间隔5s | 561.19us ~ 584.11us | 361.30us ~ 372.57us | 936.65us ~ 964.05us |
B9 | 总体32笔/s,单标的行情记录间隔2.5s | 377.92us ~ 434.16us | 339.04us ~ 351.65us | 728.18us ~ 791.13us |
B10 | 总体80笔/s,单标的行情记录间隔1s | 1244.63us ~ 3679.10us | 1222.05us ~ 6967.60us | 4073.25us ~ 25561.59us |
B11 | 总体800笔/s,单标的行情记录间隔0.1s | 433.00us ~ 487.71us | 321.44us ~ 363.36us | 767.27us ~ 848.65us |
B12 | 总体8000笔/s,单标的行情记录间隔0.01s | 552.73us ~ 640.04us | 425.60us ~ 503.89us | 987.82us ~ 1152.98us |
C:平台进程绑核 + 不使用大页内存(master绑CPU0、cached绑CPU1、md绑CPU6、td绑CPU8)
序号 | 场景 | 订单传输开销 | 行情记录传输开销 | t2o总开销 |
C1 | 总体0.2笔/s,单标的行情记录间隔400s | 292.68us ~ 327.38us | 442.14us ~ 454.69us | 798.58us ~ 838.22us |
C2 | 总体0.333笔/s,单标的行情记录间隔240s | 269.51us ~ 319.42us | 414.28us ~ 429.24us | 764.45us ~ 833.66us |
C3 | 总体0.5笔/s,单标的行情记录间隔160s | 264.76us ~ 322.82us | 409.88us ~ 435.26us | 752.51us ~ 805.74us |
C4 | 总体1笔/s,单标的行情记录间隔80s | 505.09us ~ 607.41us | 383.19us ~ 390.63us | 939.72us ~ 1050.80us |
C5 | 总体2笔/s,单标的行情记录间隔40s | 415.72us ~ 534.54us | 367.40us ~ 427.78us | 862.85us ~ 1011.42us |
C6 | 总体4笔/s,单标的行情记录间隔20s | 354.18us ~ 534.16us | 356.85us ~ 376.40us | 765.00us ~ 977.09us |
C7 | 总体8笔/s,单标的行情记录间隔10s | 375.67us ~ 425.65us | 351.65us ~ 383.34us | 765.71us ~ 829.56us |
C8 | 总体16笔/s,单标的行情记录间隔5s | 294.63us ~ 344.07us | 361.70us ~ 429.18us | 718.88us ~ 805.80us |
C9 | 总体32笔/s,单标的行情记录间隔2.5s | 297.46us ~ 347.32us | 350.58us ~ 503.69us | 688.93us ~ 871.23us |
C10 | 总体80笔/s,单标的行情记录间隔1s | 282.78us ~ 386.57us | 360.12us ~ 441.87us | 684.09us ~ 808.28us |
C11 | 总体800笔/s,单标的行情记录间隔0.1s | 238.62us ~ 258.59us | 224.41us ~ 290.56us | 481.80us ~ 567.99us |
C12 | 总体8000笔/s,单标的行情记录间隔0.01s | 1396.87us ~ 1565.20us | 1161.80us ~ 1345.29us | 2604.34us ~ 2925.68us |
D:平台进程绑核 + 使用大页内存(master绑CPU0、cached绑CPU1、md绑CPU6、td绑CPU8)
序号 | 场景 | 订单传输开销 | 行情记录传输开销 | t2o总开销 |
D1 | 总体0.2笔/s,单标的行情记录间隔400s | 320.71us ~ 357.55us | 432.78us ~ 454.92us | 778.53us ~ 827.59us |
D2 | 总体0.333笔/s,单标的行情记录间隔240s | 320.86us ~ 342.44us | 421.12us ~ 428.78us | 769.44us ~ 794.38us |
D3 | 总体0.5笔/s,单标的行情记录间隔160s | 297.84us ~ 334.32us | 406.93us ~ 413.82us | 747.44us ~ 777.56us |
D4 | 总体1笔/s,单标的行情记录间隔80s | 418.41us ~ 727.80us | 367.78us ~ 444.05us | 838.26us ~ 1198.22us |
D5 | 总体2笔/s,单标的行情记录间隔40s | 447.83us ~ 517.94us | 352.02us ~ 386.79us | 829.34us ~ 930.73us |
D6 | 总体4笔/s,单标的行情记录间隔20s | 402.15us ~ 502.56us | 349.04us ~ 367.37us | 775.97us ~ 890.08us |
D7 | 总体8笔/s,单标的行情记录间隔10s | 355.52us ~ 376.09us | 344.62us ~ 372.64us | 714.81us ~ 754.23us |
D8 | 总体16笔/s,单标的行情记录间隔5s | 307.09us ~ 345.93us | 357.38us ~ 478.28us | 686.91us ~ 836.37us |
D9 | 总体32笔/s,单标的行情记录间隔2.5s | 275.22us ~ 290.97us | 346.10us ~ 698.46us | 637.13us ~ 1001.00us |
D10 | 总体80笔/s,单标的行情记录间隔1s | 242.78us ~ 307.45us | 386.73us ~ 486.11us | 663.08us ~ 803.48us |
D11 | 总体800笔/s,单标的行情记录间隔0.1s | 226.41us ~ 239.44us | 234.97us ~ 275.24us | 475.23us ~ 511.87us |
D12 | 总体8000笔/s,单标的行情记录间隔0.01s | 1157.09us ~ 1981.76us | 908.82us ~ 1369.74us | 2284.85us ~ 3034.69us |