Linux系统
Linux物理层
LSI Raid 阵列日常操作
MegaCLI基本使用指南
重要参数含义说明
Raid的增删改
Linux系统层
timedatectl命令时间时区操作
sar命令用法
Linux 性能调优工具9张图
Linux 特殊权限说明
Linux系统三级等保整改脚本
CentOS 7 停止维护(EOL)后的仓库变动
Linux查看主板内存槽与内存信息
安装麒麟Kylin-v10 Arm64版本到阿里云
CentOS7 多网卡单网关利用策略路由实现源进源出
初始化Linux数据盘(parted)
解决CentOS7下yum命令的异常
EXSI虚机mount出现‘unknown filesystem type 'LVM2_member'’
Linux虚机网卡单队列导致压测CPU无法满载的问题
Linux网络性能优化建议
Linux 修改系统语言环境
LInux文件系统中的默认保留空间 Ext4 vs. XFS
Linux CPU占用率原理与精确度分析
中标麒麟安装Nvidia显卡驱动
Linux主机双网卡同网段同网关配置
Linux 服务层
编译Expat 2.6.2的rpm包并升级
Linux主机挂载共享samba出现普通用户没有写权限的问题
编译OpenSSH 9.3p1的rpm包并升级
CentOS 7.x通过rpm升级OpenSSH到 8.5p1版本
Linux日志切割Logrotate原理和配置详解
systemd下配置sshd监听端口
编译NTP 4.2.8p17的rpm包并升级
编译OpenSSL 1.1.1w的rpm包并升级
linux命令集
磁盘工具集
Linux du 命令
fpsync数据迁移工具
字符处理集
Linux sed 命令
Linux命令输出重定向到变量
使用 paste 合并文件内容
常用调试指令集
编译cmake 3.5.2版本
网络工具集
MTR探测主机间丢包
Linux性能测试
甲骨文主机测试
本文档使用 MrDoc 发布
-
+
home page
Linux虚机网卡单队列导致压测CPU无法满载的问题
# 问题描述 对主机所在业务做性能压测时,出现较高的CPU硬中断问题,导致CPU占用和负载无法满载的情况 ![](/media/202306/2023-06-06_104213_1417610.24659689002187823.png) # 原因分析 ## 查看中断信息记录文件 ``` cat /proc/interrupts ``` ![](/media/202306/2023-06-06_111950_2621410.8246896680576956.png) 信息示例说明: ``` [root@localhost ~]# cat /proc/interrupts -中断号- -------------单个CPU逻辑核------------ ---中断号(IQR)对应的设备名 CPU0 CPU1 CPU2 CPU3 0: 67 0 0 0 IO-APIC-edge timer(系统时钟) 1: 10 0 0 0 IO-APIC-edge i8042(键盘控制器) 6: 3 0 0 0 IO-APIC-edge floppy(软盘控制器) 8: 0 0 0 0 IO-APIC-edge rtc0(并口1) 45: 86 0 0 832576435 PCI-MSI-edge virtio3-input.0 46: 22688 0 0 0 PCI-MSI-edge virtio3-output.0 ``` 如上信息可知: - 由中断号为`45`,设备名为`virtio3-input.0`的硬中断累积值最高。 - 其中virtio-input和 virtio-output为网卡队列的中断 ## 查看物理网卡信息 查看并确认网卡是否支持多队列 ``` [root@localhost ~]# lspci -vvv|grep Ethernet -A 26 04:01.0 Ethernet controller: Red Hat, Inc. Virtio network device Subsystem: Red Hat, Inc. Device 0001 Physical Slot: 1-4 Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+ FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0 Interrupt: pin A routed to IRQ 11 Region 0: I/O ports at 5000 [size=64] Region 1: Memory at fe240000 (32-bit, non-prefetchable) [size=4K] Region 4: Memory at fc800000 (64-bit, prefetchable) [size=16K] Expansion ROM at fe200000 [disabled] [size=256K] Capabilities: [98] MSI-X: Enable+ Count=17 Masked- # 其中MSI-X表示网卡支持多队列 Vector table: BAR=1 offset=00000000 PBA: BAR=1 offset=00000800 ``` 如上信息中,`Capabilities: [98] MSI-X: Enable+` 表示网卡支持多队列 >说明: 该信息内容表示的网卡内容为物理网卡,如使用虚拟主机时,需再进一步查看虚机主机网卡对多队列的支持情况 ## 查看虚机网卡信息 ``` [root@localhost ~]# ethtool -i eth0 driver: virtio_net version: 1.0.0 firmware-version: expansion-rom-version: bus-info: 0000:04:01.0 supports-statistics: no supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no ``` 查询结果可知bus-info和物理网卡信息一致 ![](/media/202306/2023-06-06_115314_1375410.22629761566284778.png) ## 查询虚机网卡的队列信息 ``` [root@localhost ~]# ll /sys/class/net/eth0/queues total 0 drwxr-xr-x. 2 root root 0 Jun 5 15:07 rx-0 drwxr-xr-x. 3 root root 0 Jun 5 15:07 tx-0 [root@localhost ~]# ``` 如上所示,可确认,`虚机网卡目前仅支持单队列!` # 解决办法 1,升级母机的kernel.tgz、qemu.tgz、libvirt_agent.tgz三个包。并重启。 2,在母机上修改之前已创建子机对应 配置文件/etc/vm/xxxx.xml (xxxx指子机的uuid), 将xxxx.xml的: ``` <driver name='vhost' event_idx='on'/> ``` 改为 ``` <driver name='vhost' event_idx='on' queues='1'/> ``` 如果子机CPU<=8,queues设置为CPU的数量;大于等于8,queues则设置为 8。之后执行virsh define /etc/vm/xxxx.xml使改动生效。 3,重启子机,将`20170117161800_5fs6i_basic_linux_install.tar.gz`上传到子机,解压缩 并执行install.sh。 4,最后登录子机查看 ``` ll /sys/class/net/eth0/queues ``` # 总结 ## 多网卡示例 ``` 普通单队列 +-----------------------------+ | queue | | | | +----------+ +----------+| +---------+ | | packet | | packet ||---------->| CPU 0 | | +----------+ +----------+| +---------+ +-----------------------------+ 开启多网卡队列 +----------------------------+ | queue | | | | +----------+ +----------+ | +---------+ | | packet | | packet | |---------> | CPU 0 | | +----------+ +----------+ | +---------+ +----------------------------+ +---------+ | CPU 1 | +---------+ +---------+ +----------------------------+ | CPU 2 | | queue | +---------+ | | | +----------+ +----------+ | +---------+ | | packet | | packet | |---------> | CPU 3 | | +----------+ +----------+ | +---------+ +----------------------------+ ``` 通常情况下, 每张网卡有一个队列(queue), 所有收到的包从这个队列入, 内核从这个队列里取数据处理. 该队列其实是ring buffer(环形队列), 内核如果取数据不及时, 则会存在丢包的情况. 一个CPU处理一个队列的数据, 这个叫中断. 默认是cpu0(第一个CPU)处理. 一旦流量特别大, 这个CPU负载很高, 性能存在瓶颈. 所以网卡开发了多队列功能, 即一个网卡有多个队列, 收到的包根据TCP四元组信息hash后放入其中一个队列, 后面该链接的所有包都放入该队列. 每个队列对应不同的中断, 使用irqbalance将不同的中断绑定到不同的核. 充分利用了多核并行处理特性. 提高了效率.
Nathan
June 6, 2023, 12:19 p.m.
转发文档
Collection documents
Last
Next
手机扫码
Copy link
手机扫一扫转发分享
Copy link
Markdown文件
PDF文件
Docx文件
share
link
type
password
Update password