:::tips TCP重传率是网络质量的体现,特别是我所在的跨境电商行业,可以说跨境网络是一个比较头痛的问题。通过这类监控能够让我们很好的感知整体网络质量的变化,并在可能的情况下,提前做好规避。关于跨境网络我们有针对性的进行过优化,监控图我上传了二张截图,第一张网络是经过优化后的,而第二张直接访问海外的服务,可以看出网络质量差别挺大。如何进行优化,后续会写文章进行分享,前期会先完善监控这块。 :::

性能指标

指标 具体含义
tcp.retransmit.rate tcp重传率

监控脚本

数据来源于/proc/net/snmp。用到tcp项中的outsegs和retranssegs,分别表示:发出的tcp报文数量;重传的报文数量。计算公式为(retranssegs-last retranssegs) / (outsegs-last outsegs) * 100%

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*
  3. """
  4. 计算TCP重传率
  5. """
  6. import sys
  7. import time
  8. import pickle
  9. def tcp_retran():
  10. timestamp = int(time.time())
  11. path = '/proc/net/snmp'
  12. result_file = '/tmp/.zbx_result_tcp_retran.txt'
  13. with open(path, 'r') as tcp_file:
  14. for line in tcp_file:
  15. line = line.strip()
  16. if 'Tcp' not in line: continue
  17. proto, values = line.split(': ', 1)
  18. values = values.split()
  19. if 'RetransSegs' in values:
  20. headers = map(str.lower, values)
  21. data = dict(zip(headers, map(float, values)))
  22. data.update({'timestamp': timestamp})
  23. try:
  24. latest = pickle.load(open(result_file, 'rb'))
  25. except:
  26. pickle.dump(data, open(result_file, 'w'))
  27. sys.exit(0)
  28. pickle.dump(data, open(result_file, 'w'))
  29. interval = timestamp - latest['timestamp']
  30. if interval > 100:
  31. pickle.dump(data, open(result_file, 'w'))
  32. sys.exit(0)
  33. outsegs = data['outsegs'] - latest['outsegs']
  34. retranssegs = data['retranssegs'] - latest['retranssegs']
  35. retrans = retranssegs / outsegs * 100
  36. return retrans
  37. if __name__ == '__main__':
  38. print(tcp_retran())
  1. $ cat etc/zabbix_agentd.conf.d/tcp_retrans.conf
  2. # tcp.retrans
  3. UserParameter = tcp.retransmit.rate, python /usr/local/services/zabbix-3.0.0/scripts/tcp_retrans.py

监控模板

模板中定义了{$PER},值为1,也就默认超过1%,就会进行告警,当然可以根据实际情况进行调整。
模板:https://github.com/arwei/Zabbix。

监控图

优化后
Zabbix 监控系列 - TCP重传率 - 图1

优化前
Zabbix 监控系列 - TCP重传率 - 图2

推荐阅读

Zabbix 监控系列 - TCP重传率
【tcp】如何计算、监控TCP重传率?_HunterMichaelG的博客-CSDN博客_tcp重传率高原因