夜莺是一个通用的数值型时序数据监控系统,不止监控机器,还监控各类中间件、日志、业务模块,所以没法直接根据要监控的机器做配置度量。夜莺的各个模块中,tsdb模块是性能瓶颈,因为要存储数据落盘,需要消耗硬盘IO,监控指标的量比较大的话,就需要更多机器来承载这个IO。

    我们使用如下配置的机器做了性能压测,供各位参考:

    1. CPU
    2. Architecture: x86_64
    3. CPU op-mode(s): 32-bit, 64-bit
    4. Byte Order: Little Endian
    5. CPU(s): 40
    6. On-line CPU(s) list: 0-39
    7. Thread(s) per core: 2
    8. Core(s) per socket: 10
    9. Socket(s): 2
    10. NUMA node(s): 2
    11. Vendor ID: GenuineIntel
    12. CPU family: 6
    13. Model: 79
    14. Model name: Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz
    15. Stepping: 1
    16. CPU MHz: 2200.000
    17. BogoMIPS: 4405.48
    18. Virtualization: VT-x
    19. L1d cache: 32K
    20. L1i cache: 32K
    21. L2 cache: 256K
    22. L3 cache: 25600K
    23. NUMA node0 CPU(s): 0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38
    24. NUMA node1 CPU(s): 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39
    25. 内存:
    26. total used free shared buff/cache available
    27. Mem: 125G 25G 1.2G 4.0G 99G 94G
    28. Swap: 0B 0B 0B
    29. 硬盘:
    30. SATA SSD RAID5

    压测方法:
    10内写入200万个点,即每秒大约20个万个点,机器各性能指标如图

    CPU看起来还好,超线程的,40个逻辑核,如果16核应该也没问题
    image.png

    内存差不多到了34G,之前机器上有其他进程在跑,已经用了15.5G,所以TSDB模块吃掉了18.5GB
    image.png
    IO.UTIL整体没有维持在100%,其实即使维持在100%也未必就代表硬盘IO能力被榨干了
    image.png
    IO.AWAIT更有参考意义,维持在10左右,很平稳,说明进来的IO请求都正常被处理了,另外队列深度也没有明显增加,说明IO没有被打到瓶颈
    image.png

    所以,每秒20万个点,理论上16C32G的SSD机器,可以抗住,并且还有余量,但是余量也不多了。
    如果,我们只监控机器,每个机器大约采集150个监控指标,我们来计算不同采集频率可以抗住多少台机器。

    1. 如果采集频率是10s20万*10s/150=13333
    2. 如果采集频率是60s20万*60s/150=80000

    tsdb底层使用rrdtool,默认有4个归档策略,如果把归档策略调整为2个(会牺牲历史数据的精度),IO会减少50%,相应的单机每秒可以抗40万指标。rrdtool在归档的时候,对于归档数据会计算max、min、avg,如果我们改成只保留avg,IO又会大幅减少,所以具体还是看需求,来灵活调整。