Linux 内核优化简笔 - 高并发的系统

2024-04-01 18:12

本文主要是介绍Linux 内核优化简笔 - 高并发的系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介

Linux 服务器在高并发场景下,默认的内核参数无法利用现有硬件,造成软件崩溃、卡顿、性能瓶颈。

当然,修改参数只是让Linux更好软件的去利用已有的硬件资源,如果硬件资源不够也无法解决问题的。而且当硬件资源不足的时候,某些参数过大可能也会占用多余资源,或者影响稳定性。 或者让单个进程占用过多资源,影响整体系统的运行。

写本文的起因主要是对zabbix 服务器的高并发需求,还有数据库、Nginx、ES集群的高并发需求。

在这里插入图片描述

博客:https://songxwn.com

注意:

在/etc/sysctl.conf 修改的,可以使用sysctl -p 立即生效,使用sysctl -a 查看当前数值。

在/etc/security/limits.conf 修改的,需要重启服务或系统才能生效,或者用ulimit 单独去配置。

最大文件打开句柄数量 - max open files

Linux 下一切皆文件,一般如果遇到文件句柄达到上限时,会碰到"Too many open files"或者Socket/File: Can’t open so many files等错误。

在 linux 中,每个连接都会占用一个文件句柄,所以句柄数量限制同样也会限制最大连接数, 对于像 Nginx 这样的反向代理,对于每个请求,它会与 client 和 upstream server 分别建立一个连接,即占据两个文件句柄,所以理论上来说 Nginx 能同时处理的连接数最多是系统最大文件句柄数限制的一半。

lsof | wc -l
# 可以查看当前打开文件的数量

系统级和进程级限制、异步 I/O 操作的最大数目

vim /etc/sysctl.conf
fs.file-max = 9223372036854775807
fs.nr_open = 1073741816
fs.aio-max-nr = 1048576 
sysctl -p
# 应用
cat /proc/sys/fs/file-max
# 查看实时

用户级限制

vim /etc/security/limits.conf
* soft nofile 1024000
* hard nofile 1024000
ulimit -a
# 需要重启生效

消息队列大小

vim /etc/sysctl.conf
kernel.msgmnb = 65536
# 单个消息队列中单个消息的最大允许大小(以字节为单位)
kernel.msgmax = 65536
# 用于指定从一个进程发送到另一个进程的消息的最大长度
kernel.shmmax = 18446744073692774399
# 定义 Linux 进程在其虚拟地址空间中可分配的单个共享内存段的最大字节大小。
kernel.shmall = 18446744073692774399
# 定义可用于系统范围的共享内存页面总数。要使用整个主内存,kernel.shmall 参数的值应当为主内存大小总计。

最大用户进程

vim /etc/security/limits.conf
* soft nproc 127671
* hard nproc 127671
ulimit -a

虚拟内存大小 - vm.max_map_count

限制一个进程可以拥有的VMA(虚拟内存区域)的数量,常用于 ES集群。

vim /etc/sysctl.conf
vm.max_map_count=655360
sysctl -p
sysctl -a|grep vm.max_map_count

调整stack size的大小

Linux系统初始的堆栈大小

vim /etc/security/limits.conf
* soft stack 262140
* hard stack 262140

网络相关

调整网络设备积压队列以避免数据包丢弃

vim /etc/sysctl.conf
net.core.netdev_max_backlog = 25000

TCP TIME_WAIT 连接复用开启

如果短连接并发量较高,它所在 netns 中 TIME_WAIT 状态的连接就比较多,而 TIME_WAIT 连接默认要等 2MSL 时长才释放,长时间占用源端口,当这种状态连接数量累积到超过一定量之后可能会导致无法新建连接。

所以建议开启 TIME_WAIT 复用,即允许将 TIME_WAIT 连接重新用于新的 TCP 连接:

vim /etc/sysctl.conf
net.ipv4.tcp_tw_reuse=1

套字节接受和发送缓冲区

vim /etc/sysctl.conf
net.core.rmem_default=26214400
net.core.wmem_default=26214400 
net.core.rmem_max=26214400  
net.core.wmem_max=26214400 

TCP 接受和发送缓冲区 最低/默认/最大

vim /etc/sysctl.conf
net.ipv4.tcp_rmem=16384 26214400 26214400
net.ipv4.tcp_wmem=32768 26214400 26214400

TCP窗口大小

vim /etc/sysctl.conf
net.ipv4.tcp_window_scaling=1
# TCP 窗口大小缩放

调大TCP全连接连接队列的大小

vim /etc/sysctl.conf
net.core.somaxconn=65535

UDP 接受和发送缓冲区

UDP socket 的发送和接收缓冲区是有上限的,如果缓冲区较小,高并发环境可能导致缓冲区满而丢包,从网络计数可以看出来:

vim /etc/sysctl.conf
net.ipv4.udp_mem=374394 26214400 26214400

TCP BBR - 高延迟/高丢包网络优化

介绍文章: https://songxwn.com/TCP_BBR/

vim /etc/sysctl.conf
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
# 需要内核4.9以上,BBRv3 需要安装较新的Xanmod内核。

TCP/UDP本地端口新建范围

高并发场景,对于 client 来说会使用大量源端口,源端口范围从 net.ipv4.ip_local_port_range 这个内核参数中定义的区间随机选取,在高并发环境下,端口范围小容易导致源端口耗尽,使得部分连接异常。通常 Pod 源端口范围默认是 32768-60999,建议将其扩大.

vim /etc/sysctl.conf
net.ipv4.ip_local_port_range = 15000 64000
# 默认是32768 60999 ,注意不要和已有端口冲突。

net.netfilter.nf_conntrack_max 用于控制连接跟踪表的最大大小

.net.netfilter.nf_conntrack_max不是越高越好,通常根据内存大小进行设置。
nf_conntrack_max计算公式(64位)
CONNTRACK_MAX = RAMSIZE (inbytes)/16384/2

例如你的机器是一个64GB 64bit的系统,那么最合适的值是

CONNTRACK_MAX = 6410241024*1024/16384/2 = 2097152

vim /etc/sysctl.conf
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
net.nf_conntrack_max = 1048576

最终推荐参数

sysctl

cat > /etc/sysctl.conf <<EOF
fs.file-max = 9223372036854775807
fs.nr_open = 1073741816
kernel.msgmnb = 65536
kernel.msgmax = 65536
vm.max_map_count=655360
net.core.netdev_max_backlog = 25000
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_rmem=16384 26214400 26214400
net.ipv4.tcp_wmem=32768 26214400 26214400
net.ipv4.tcp_window_scaling=1
net.core.somaxconn=65535
net.core.rmem_default=26214400
net.core.wmem_default=26214400 
net.core.rmem_max=26214400  
net.core.wmem_max=26214400
net.ipv4.udp_mem=374394 26214400 26214400
net.ipv4.ip_local_port_range=15000 64000
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_established = 3600
net.nf_conntrack_max = 1048576
EOF
# 配置
sysctl -p
# 

ulimit

cat > /etc/security/limits.conf <<EOF
* soft nofile 1024000
* hard nofile 1024000
* soft nproc 127671
* hard nproc 127671
* soft stack 262140
* hard stack 262140
EOF
# 需要重启系统/进程/重新登录才能生效。

参考:

https://support.huaweicloud.com/trouble-ecs/ecs_trouble_0324.html

百看不如一练,动手测试单机百万连接的保姆级教程!

https://support.huaweicloud.com/ecs_faq/ecs_faq_1327.html

https://cloud.tencent.com/document/product/213/46400

https://cloud.tencent.com/document/product/213/57336

https://imroc.cc/kubernetes/best-practices/performance-optimization/network

https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/9/html/managing_monitoring_and_updating_the_kernel/parameters-affecting-performance-of-database-applications_adjusting-kernel-parameters-for-database-servers

https://cloud.google.com/compute/docs/networking/tcp-optimization-for-network-performance-in-gcp-and-hybrid?hl=zh-cn

https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/9/html/monitoring_and_managing_system_status_and_performance/tuning-udp-connections_tuning-the-network-performance

https://cloud.google.com/blog/products/gcp/5-steps-to-better-gcp-network-performance

这篇关于Linux 内核优化简笔 - 高并发的系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/867815

相关文章

kali linux 无法登录root的问题及解决方法

《kalilinux无法登录root的问题及解决方法》:本文主要介绍kalilinux无法登录root的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录kali linux 无法登录root1、问题描述1.1、本地登录root1.2、ssh远程登录root2、

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python通过模块化开发优化代码的技巧分享

《Python通过模块化开发优化代码的技巧分享》模块化开发就是把代码拆成一个个“零件”,该封装封装,该拆分拆分,下面小编就来和大家简单聊聊python如何用模块化开发进行代码优化吧... 目录什么是模块化开发如何拆分代码改进版:拆分成模块让模块更强大:使用 __init__.py你一定会遇到的问题模www.

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子