[转帖]单节点高并发Linux服务器影响接入能力的因素有哪些

节点,并发,linux,服务器,影响,接入,能力,因素,哪些 · 浏览次数 : 0

小编点评

## 华为云网卡多队列优化性能 **1. 网卡多队列概述** 网卡多队列技术可以提升系统的网络性能,通过设置多个队列来处理数据包的传输和接收。当单个队列的处理能力有限时,可以将数据包分配到多个队列中进行处理,以提升系统的性能。 **2. 华为云网卡多队列优化步骤** **a. 开启网卡多队列功能** ```bash ifconfig eth0 txqueuelen 10000 ``` **b. 开启irqbalance服务** ```bash echo 'ifconfig eth0 txqueuelen 10000' >> /etc/init.d/irqbalance start ``` **c. 设置网卡传输队列长度** ```bash ifconfig eth0 txqueuelen 10000 ``` **d. 调整网卡txqueuelen值** ```bash ip link set dev eth0 txqueuelen 10000 ``` **e. 测试网卡多队列性能** 可以通过设置测试参数来测试网卡多队列的性能,例如: * `net.tcp.max_queue_length`:最大队列长度 * `net.tcp.max_queue_depth`:队列深度 **3. 优化网卡多队列性能** * 使用性能测试工具分析网络性能 * 调整网卡队列长度和深度 * 使用设置参数优化网络性能 * 优化业务架构以减少网络时延 **4. 总结** 华为云网卡多队列技术可以优化系统的网络性能,通过设置多个队列来处理数据包的传输和接收,提升系统的性能,但需要注意外部设备的连接数、最大新建连接数等因素对性能的影响。

正文

在单台服务器承载数十万并发的情况下,影响服务器接入能力的因素已经不在是CPU、内存、带宽等表层因素,而是内核参数、设备配置、应用优化等多种细节因素。

1、最大打开文件数

Linux 中所有内容都是以文件的形式保存和管理的, 包括套接字、网络通信等资源,即一切皆文件,因此提升最大打开文件数是提高服务器并发性能的重要一步。

Linux的最大打开文件数限制包括系统级(系统可打开的最大文件数)、用户级(单个用户可打开的最大文件数)、进程级(单个进程可打开的最大文件数),可分别通过如下方式修改:

  1. # 系统级
  2. # 默认值为内存总量的10%, 需根据内存大小设置
  3. echo "fs.file-max=XXXX" >> /etc/sysctl.conf
  4. sysctl -p
  5. # 用户级
  6. # 默认值为1024, 可通过ulimit -n查看, 重新登录生效
  7. echo "* soft nofile 102400" >> /etc/security/limits.conf
  8. echo "* hard nofile 102400" >> /etc/security/limits.conf
  9. # 进程级
  10. # 默认值为1048576
  11. echo "fs.nr_open=XXXX" >> /etc/sysctl.conf
  12. sysctl -p

2、nf_conntrack

对开启iptables的服务器,iptables的connection-tracking模块使用系统内存的一部分来跟踪表中的连接。nf_conntrack表中记录了服务器的所有连接细节。

  1. # conntrack -L 或
  2. # cat /proc/net/nf_conntrack
  3. ipv4 2 udp 17 135 src=10.0.2.15 dst=192.168.61.200 sport=52162 dport=53 src=192.168.61.200 dst=10.0.2.15 sport=53 dport=52162 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
  4. ipv4 2 tcp 6 431999 ESTABLISHED src=10.0.2.2 dst=10.0.2.15 sport=19365 dport=22 src=10.0.2.15 dst=10.0.2.2 sport=22 dport=19365 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
  5. ipv4 2 udp 17 142 src=10.0.2.15 dst=178.215.228.24 sport=123 dport=123 src=178.215.228.24 dst=10.0.2.15 sport=123 dport=123 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
  6. ipv4 2 udp 17 16 src=10.0.2.15 dst=192.168.61.200 sport=54059 dport=53 src=192.168.61.200 dst=10.0.2.15 sport=53 dport=54059 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
  7. ipv4 2 udp 17 142 src=10.0.2.15 dst=202.118.1.130 sport=123 dport=123 src=202.118.1.130 dst=10.0.2.15 sport=123 dport=123 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
  8. ipv4 2 udp 17 142 src=10.0.2.15 dst=193.182.111.143 sport=123 dport=123 src=193.182.111.143 dst=10.0.2.15 sport=123 dport=123 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
  9. ipv4 2 udp 17 76 src=10.0.2.15 dst=192.168.61.200 sport=60831 dport=53 src=192.168.61.200 dst=10.0.2.15 sport=53 dport=60831 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2

在高并发场景下,该表条目数可能达到最大值,而造成网络丢包。因此需要增加连接跟踪条目的最大数量。调整方法参考华为云文档:https://support.huaweicloud.com/intl/zh-cn/trouble-ecs/ecs_trouble_0324.html

CentOS 6系列操作系统处理方法

  1. # 执行以下命令,查看nf_conntrack_max参数。
  2. sysctl net.netfilter.nf_conntrack_max
  3. # 检查当前正在跟踪的连接数。
  4. cat /proc/sys/net/netfilter/nf_conntrack_count
  5. # 如果该值达到nf_conntrack_max值则会出现包被丢弃的现象。
  6. # 提高net.netfilter.nf_conntrack_max值(以内存为64G,net.netfilter.nf_conntrack_max值2097152为例)。
  7. # 执行以下命令,使配置即时生效。
  8. sysctl -w net.netfilter.nf_conntrack_max=2097152
  9. # 执行以下命令确保重启后配置仍然生效。
  10. echo "net.netfilter.nf_conntrack_max = 2097152" >> /etc/sysctl.conf
  11. # 说明:net.netfilter.nf_conntrack_max不是越高越好,通常根据内存大小进行设置。
  12. # nf_conntrack_max计算公式(64位)
  13. # CONNTRACK_MAX = RAMSIZE (inbytes)/16384/2
  14. # 例如你的机器是一个64GB 64bit的系统,那么最合适的值是
  15. # CONNTRACK_MAX = 64*1024*1024*1024/16384/2 = 2097152
  16. # 如果conntrack表中的条目数量显著增加(例如以4倍的速度增加),则还应增加存储conntrack条目的哈希表的大小以提高效率。
  17. # 计算新的哈希值:在CentOS 6及以上版本,计算公式是hashsize = conntrack_max/4
  18. # 执行以下命令,设置新的哈希大小。
  19. echo "options nf_conntrack expect_hashsize=131072 hashsize=131072" >/etc/modprobe.conf
  20. # 重启iptables。
  21. service iptables restart

CentOS 7系列操作系统处理方法

  1. # 执行以下命令,在/etc/modprobe.d/firewalld-sysctls.conf中设置conntrack条目的哈希值。
  2. # 在CentOS 6及以上版本,计算公式是hashsize = conntrack_max/4
  3. echo "options nf_conntrack expect_hashsize=131072 hashsize=131072" >> /etc/modprobe.d/firewalld-sysctls.conf
  4. # 重启firewalld。
  5. systemctl restart firewalld
  6. # 确认参数修改成功。
  7. sysctl -a |grep nf_conntrack_max

hashsize = conntrack_max/4,此表达式可看作较优设置,实际哈希表大小通常为总表的1/8~1/2。

https://www.kernel.org/doc/html/latest/networking/nf_conntrack-sysctl.html

3、网卡多队列

网卡多队列技术概述

当今的高档服务器上运行着更多的处理器,运行在其上的客户机所拥有的vCPU数量也越来越多。在单一的virtio-net队列中,由于网络性能无法随着vCPU的数量动态的伸缩,导致客户机的协议栈规模受限。因为传统的单virtio-net只有单一的TX(发送)和RX(接收)队列,客户机不能并行的传输和接收数据包。

为了解决这个问题,我们需要在nova启动的客户实例中加入网卡多队列的功能。virtio-net的数量根据客户机中vCPU的数量手动伸缩,从而提升系统的网络性能。

在下面这些场景时,网卡多队列提升了系统的性能:

  1. 传输的数据包变大;
  2. 客户机中同时存在多个网络连接;
  3. 客户机有多个vCPU,队列最大数与vCPU数量一致;

然而,网卡多队列受到一系列的限制且带来一些负面效果:

  1. 受限于MSI vector:message signal interrupt的数量;
  2. 有时会造成对外流量传输性能下降;
  3. 增加CPU负载;
  4. 多网卡情况下,多队列特性不那么重要。

不同的云厂商对此有不同的支持,可以参考厂商操作文档,例如:

大致有两步:

  1. # 开启网卡的多队列功能。
  2. # 此命令作用是设置主网卡eth0使用两个队列。
  3. ethtool -L eth0 combined 2
  4. # 开启irqbalance服务,让系统自动调整网络中断在多个CPU核上的分配
  5. /etc/init.d/irqbalance start

4、网卡txqueuelen

网卡传输队列长度Transmit Queue Length (txqueuelen),在大流量业务场景下,会影响网卡的处理性能。默认值为1000,不宜设置过大,可能会增加网络时延。

调整方法为:

  1. ifconfig eth0 txqueuelen 10000
  2. # 或者
  3. ip link set dev eth0 txqueuelen 10000
  4. # 永久生效
  5. echo 'ifconfig eth0 txqueuelen 10000' >> /etc/rc.local
  6. # 或者
  7. echo 'ip link set dev eth0 txqueuelen 10000' >> /etc/rc.local

外部因素

除系统本身外,单节点高并发能力还严格受限于外部设备如防火墙、交换机、虚拟化环境中的虚拟交换机的最大并发连接数、最大新建连接数等因素,均是在生产环境中需要密切关注的点,不过最根本的方法还是通过业务架构改造实现负荷的平均分担和系统的灵活伸缩。

文章知识点与官方知识档案匹配,可进一步学习相关知识
云原生入门技能树首页概览9032 人正在系统学习中

与[转帖]单节点高并发Linux服务器影响接入能力的因素有哪些相似的内容:

[转帖]单节点高并发Linux服务器影响接入能力的因素有哪些

在单台服务器承载数十万并发的情况下,影响服务器接入能力的因素已经不在是CPU、内存、带宽等表层因素,而是内核参数、设备配置、应用优化等多种细节因素。 1、最大打开文件数 Linux 中所有内容都是以文件的形式保存和管理的, 包括套接字、网络通信等资源,即一切皆文件,因此提升最大打开文件数是提高服务器

[转帖]openGauss 3.0 单节点安装部署

https://www.modb.pro/db/568455?utm_source=index_ori openGauss来源于PostgreSQL 9.2.4pg使用c实现,gs使用c++实现一个实例多个库 单机HA不是支持一主一备,提供高可靠和读扩展,备机最多8套。 主备部署模块说明:OM运维管

[转帖]openGauss 3.0 单节点安装部署

https://cdn.modb.pro/db/568455 openGauss来源于PostgreSQL 9.2.4pg使用c实现,gs使用c++实现一个实例多个库 单机HA不是支持一主一备,提供高可靠和读扩展,备机最多8套。 主备部署模块说明:OM运维管理模块:提供日常运维、配置管理接口,工具在

[转帖]openGauss 3.0 单节点安装部署

https://cdn.modb.pro/db/568455 openGauss来源于PostgreSQL 9.2.4pg使用c实现,gs使用c++实现一个实例多个库 单机HA不是支持一主一备,提供高可靠和读扩展,备机最多8套。 主备部署模块说明:OM运维管理模块:提供日常运维、配置管理接口,工具在

[转帖]consul 多节点/单节点集群搭建

https://www.cnblogs.com/valiantjiang/p/15004565.html 三节点配置 下载安装包 mkdir /data/consul mkdir /data/consul/data curl -SLO https://github.com/consul/1.9.5/

[转帖]K8S集群内部 无持久化Redis单节点配置文件

K8S集群内部 无持久化Redis单节点配置文件 apiVersion: apps/v1 kind: Deployment metadata: name: redis-deploy spec: selector: matchLabels: prod: redis replicas: 1 templa

[转帖]Elasticsearch-索引性能调优

1:设置合理的索引分片数和副本数 索引分片数建议设置为集群节点的整数倍,初始数据导入时副本数设置为 0,生产环境副本数建议设置为 1(设置 1 个副本,集群任意 1 个节点宕机数据不会丢失;设置更多副本会占用更多存储空间,操作系统缓存命中率会下降,检索性能不一定提升)。单节点索引分片数建议不要超过

[转帖]Redis 单机模式,主从模式,哨兵模式(sentinel),集群模式(cluster),第三方模式优缺点分析

https://www.cnblogs.com/leffss/p/11993646.html Redis 的几种常见使用方式包括: 单机模式 主从模式 哨兵模式(sentinel) 集群模式(cluster) 第三方模式 单机模式 Redis 单副本,采用单个 Redis 节点部署架构,没有备用节点

[转帖]为什么说MySQL单表行数不要超过2000w?

https://segmentfault.com/a/1190000042716913 大家好,我是不才陈某~ 作为在后端圈开车的多年老司机,是不是经常听到过,“mysql 单表最好不要超过 2000w”,“单表超过 2000w 就要考虑数据迁移了”,“你这个表数据都马上要到 2000w 了,难怪查

[转帖]使用 TiUP cluster 在单机上安装TiDB

https://zhuanlan.zhihu.com/p/369414808 TiUP 是 TiDB 4.0 版本引入的集群运维工具,TiUP cluster 是 TiUP 提供的使用 Golang 编写的集群管理组件,通过 TiUP cluster 组件就可以进行日常的运维工作,包括部署、启动、关