网卡软中断绑定优化
来源:互联网 发布:软件项目进度表 excel 编辑:程序博客网 时间:2024/06/06 18:59
今天测试刚好发现一个关于网卡软中断不均衡的问题,之前处理过类似情况,一直未有总结,今天稍作总结下,并写了个自动化绑定脚本。关于什么是软中断,网卡硬件中断队列,RFS,RPS 这些概,这里不做具体解释。感兴趣可自行google
问题现象:
1. 网卡软中断不平衡,集中在一个CPU核心上(mpstat 查看%soft集中,通常是cpu0)
2. 网卡的硬件中断队列不够, < CPU 核心数,无法一对一绑定,导致部分CPU核心%soft 较少,CPU使用不均衡
解决办法:
情况1: 绑定网卡中断,通常是和CPU 一对一绑定
情况2: 开启RFS,RPS
最终效果:
mpstat -P ALL 2
cpu 线程利用率
附上tuneNetSoft.py 脚本内容,主要是用于绑定软中断和开启RPS,RFS
#!/usr/bin/env python#python version < 3#net irq_smp_affinity && rps,rfs setting#version 1.0#author: pyltimport refrom os import system,popenfrom os import walk as walkdirfrom optparse import OptionParserRPS_CPUS_VALUE = 'ffffffff'RPS_FLOW_VALUE = '4096'RPS_RFS_DEFAULT = '0'interrupts_file = '/proc/interrupts'rps_cpus_list = []rps_flow_list = []#ENTRY_VALUE=32768def get_device(): return re.findall(r'([a-z]+\d+)\s+Link.*',popen('ifconfig').read())def get_rfs_rps_file(net_device): rps_path = '/sys/class/net/' + net_device + '/queues/' for s in walkdir(rps_path): if len(s[2]) == 2: rps_cpus_list.append('/'.join([s[0],s[2][0]])) rps_flow_list.append('/'.join([s[0],s[2][1]]))def file_hander(TARGET,VALUE='0'): try: f_hander = open(TARGET,'w') f_hander.write(VALUE) finally: f_hander.close()def set_rfs_rps(net_device): get_rfs_rps_file(net_device) def set_rps_cpus_value(PATH): file_hander(PATH,RPS_CPUS_VALUE) def set_rps_flow_value(PATH): file_hander(PATH,RPS_FLOW_VALUE) map(set_rps_cpus_value,rps_cpus_list) map(set_rps_flow_value,rps_flow_list) def unset_rfs_rps(net_device): get_rfs_rps_file(net_device) def unset_rps_cpus_value(PATH): file_hander(PATH,RPS_RFS_DEFAULT) def unset_rps_flow_value(PATH): file_hander(PATH,RPS_RFS_DEFAULT) map(unset_rps_cpus_value,rps_cpus_list) map(unset_rps_flow_value,rps_flow_list) def set_irq_balance(): stop_irq_balance = 'service irqbalance stop' system(stop_irq_balance) interrupts_ct = open(interrupts_file) cores_nr = len(interrupts_ct.readline().split()) # 获取CPU核心数 irq_bit = 0 while True: inter_line = interrupts_ct.readline() if inter_line == "": break js = inter_line.split() if len(js[-1]) > 5: if re.match(r'eth.-',js[-1][:5]): irq_nr = js[0][:-1] TARGET = '/proc/irq/%s/smp_affinity' %(irq_nr) VALUE = str(re.sub('0x','',hex(1 << irq_bit))) #1 << irq_bit 相对于2的N次方 ,hex() 二进制转十六进制 file_hander(TARGET,VALUE) irq_bit += 1 if irq_bit == cores_nr:irq_bit = 0def unset_irq_balance(): start_irq_balance = 'service irqbalance start' system(start_irq_balance) def usage(): usage = '''=================================================Description: irq_balance_set && rfs_rps_set toolsUsage: <script> -i : set irq smp_affinity -I : unset irq smp_affinity -r : set rfs && rps -R : unset rfs && rps ''' print usageif __name__ == '__main__': parser = OptionParser() parser.add_option("-i", action="store_true", dest="irq_true", default=False) parser.add_option("-I", action="store_true", dest="irq_false", default=False) parser.add_option("-r", action="store_true", dest="rps_true", default=False) parser.add_option("-R", action="store_true", dest="rps_false", default=False) (options, args) = parser.parse_args() if options.irq_true == True: set_irq_balance() print "irq_balance_set successfully" elif options.irq_false == True: unset_irq_balance() print "unset irq balance successfully" elif options.rps_true == True: device_list = get_device() map(set_rfs_rps,device_list) print "rfs&&rps configured successfully" elif options.rps_false == True: device_list = get_device() map(unset_rfs_rps,device_list) print "unconfigured rfs&&rps successfully" else: usage()
0 0
- 网卡软中断绑定优化
- 网卡软中断绑定–网卡中断亲和力
- 网卡软中断过高问题优化总结
- 网卡中断优化
- 网卡中断绑定cpu亲核性
- 网卡多队列及中断绑定
- 多队列网卡设置CPU中断绑定
- 多队列网卡及网卡中断绑定阐述
- 如何将网卡中断绑定到特定cpu?
- SSD优化案例:读策略优化和中断多核绑定
- 10G(82599EB) 网卡测试优化(中断处理)
- 绑定网卡
- 网卡绑定
- Linux技巧:多核下绑定网卡中断到不同CPU(core)总结
- 多收发对列的网卡的中断与cpu亲缘关系绑定
- 工作笔记:linux绑定CPU、软中断
- linux网卡命令,网卡绑定
- 网卡中断负载均衡
- Javascript继承之最佳实践
- ny 324 猴子吃桃问题
- Android 图片内存缓存
- Spring笔记之一 -- 简单入门讲解HelloWorld
- 通过一个工具类更深入理解动态代理和Threadlocal
- 网卡软中断绑定优化
- 关于支付宝接口整合的几个问题
- poj 2442
- [leetcode] Maximum Depth of Binary Tree
- eclipse快捷键汇总
- 友盟在线参数+自动更新升级SDK实现指定版本强制更新升级
- CodeForces 154B——Colliders
- 数据库 SQLite
- Effective C++读书笔记之七:为多态基类声明virtual析构函数