高并发下的linux优化
针对高并发服务,对 Linux 内核和网络进行优化可以提高系统的性能和稳定性。本文将深入探讨如何对 Linux 内核和网络进行优化,包括调整内核参数、调整网络性能参数、使用 TCP/IP 协议栈加速技术、下面将介绍一些可用于优化Linux内核和网络的技术,并详细说明需要优化哪些配置。
Linux内核优化
Linux内核是高并发服务的关键组件之一。以下是一些可用于优化Linux内核的配置。
调整文件句柄限制
Linux 内核对于每个进程都有一个文件描述符(file descriptor)数组,文件描述符可以看成是操作系统对于文件或者 I/O 设备打开的引用。在高并发场景下,进程所需的文件描述符数量会增加,如果进程的文件描述符数量不足,就会出现“too many open files”的错误。因此,需要适当调整文件句柄数量,增加系统可同时打开的文件数。可以通过以下命令来查看当前文件句柄限制:
ulimit -n
默认情况下,文件句柄限制为1024。如果需要打开更多的文件和套接字,请使用以下命令来增加文件句柄限制:
ulimit -n 65535
调整进程数量限制
在高并发场景下,进程数量可能会增加。如果系统对于进程数量的限制过低,就会导致进程无法创建,从而影响系统的正常运行。因此,需要适当调整进程数量限制。
在 Linux 中,可以通过修改 /etc/security/limits.conf 文件来调整进程数量限制。
例如,可以将每个用户可创建的进程数量修改为 65535:
* soft nproc 65535 * hard nproc 65535
调整TCP参数
TCP/IP协议栈是高并发服务中的重要组成部分,通过调整TCP/IP协议栈参数,可以提高网络性能。以下是一些常用的TCP/IP协议栈参数:
net.ipv4.tcp_max_syn_backlog:用于指定SYN队列的最大长度。
net.ipv4.tcp_syncookies:用于启用SYN Cookies机制,防止SYN Flood攻击。
net.ipv4.tcp_syn_retries:用于指定SYN重试次数。
net.ipv4.tcp_synack_retries:用于指定SYN/ACK重试次数。
net.ipv4.tcp_fin_timeout:用于指定TCP连接关闭的超时时间。
net.ipv4.tcp_tw_reuse:用于启用TIME-WAIT状态的连接重用。
net.ipv4.tcp_tw_recycle:用于启用TIME-WAIT状态的连接回收。
net.ipv4.tcp_max_tw_buckets:用于指定TIME-WAIT状态的连接的最大数量。
net.ipv4.tcp_rmem:用于指定接收缓冲区的大小。
net.ipv4.tcp_wmem:用于指定发送缓冲区的大小。
net.core.somaxconn:用于指定套接字的最大连接数。
net.core.netdev_max_backlog:用于指定网络设备接收队列的最大长度。
可以使用以下命令来查看当前TCP/IP协议栈参数:
sysctl net.ipv4.tcp*
可以使用以下命令来修改TCP/IP协议栈参数:
sysctl -w 参数名=参数值
#或者修改配置文件
vim /etc/sysctl.conf
#生效
/sbin/sysctl -p
调整内存参数
在高并发服务中,内存管理也是很重要的。可以通过调整内存参数来优化内存管理。以下是一些常用的内存参数:
-
vm.min_free_kbytes:这个参数用来指定系统中最小的空闲内存大小。如果系统中的空闲内存低于这个值,系统会尝试回收内存。对于高并发服务,建议将这个值调整为较高的数值,例如 65536(64MB)。
-
vm.swappiness:这个参数用来控制系统使用 swap 分区的程度。如果这个值为 0,系统只有在完全没有空闲内存时才会使用 swap 分区。如果这个值为 100,系统会尽可能地使用 swap 分区。对于高并发服务,建议将这个值调整为较低的数值,例如 10。
-
vm.dirty_ratio 和 vm.dirty_background_ratio:这两个参数用来控制脏页的数量。脏页是指已经被修改但尚未被写回磁盘的页。当系统中的脏页数量超过这两个参数指定的阈值时,系统会触发写回操作。对于高并发服务,建议将这两个值调整为较低的数值,例如 5 和 2。
可以使用以下命令来查看当前内存参数:
sysctl vm.*
可以使用以下命令来修改内存参数:
sysctl -w 参数名=参数值
#或者修改配置文件
vim /etc/sysctl.conf
#生效
/sbin/sysctl -p
Linux网络优化
Linux网络是高并发服务的另一个关键组件。以下是一些可用于优化Linux网络的配置。
调整MTU
MTU是最大传输单元的缩写。在高并发服务中,MTU的大小会影响网络性能。如果MTU太小,则会增加网络包的数量,从而增加了网络负载。如果MTU太大,则可能会导致网络包被分成多个片段,从而增加了网络延迟。因此,调整MTU是提高网络性能的重要步骤之一。
可以使用以下命令来查看当前MTU值:
ip link show
可以使用以下命令来修改MTU值:
ip link set dev eth0 mtu 1500
调整网络缓冲区
在高并发服务中,网络缓冲区的大小也会影响网络性能。可以通过调整网络缓冲区来提高网络性能。以下是一些常用的网络缓冲区参数:
net.core.rmem_max:用于指定接收缓冲区的最大大小。
net.core.wmem_max:用于指定发送缓冲区的最大大小。
net.core.rmem_default:用于指定接收缓冲区的默认大小。
net.core.wmem_default:用于指定发送缓冲区的默认大小。
可以使用以下命令来查看当前网络缓冲区参数:
sysctl net.core.*
可以使用以下命令来修改网络缓冲区参数:
sysctl -w 参数名=参数值
使用TCP/IP协议栈加速技术
TCP协议栈的加速主要通过以下两种方式实现:
-
改进拥塞控制算法
TCP拥塞控制算法是保证网络传输可靠的重要机制,但是其效率较低。因此,可以通过改进拥塞控制算法来提高网络传输的速度和性能。例如,可以采用一些更为先进的拥塞控制算法,如TCP BBR、TCP Cubic等。
-
增加TCP窗口大小
TCP窗口大小是控制数据传输速度的重要参数。通过增加TCP窗口大小,可以提高网络传输的速度和性能。例如,可以通过调整TCP窗口大小的最大值和初始值来提高网络传输的速度和性能。
UDP协议栈的加速主要通过以下方式实现:
-
发送方尽量避免丢包
由于UDP协议是面向无连接的,因此在数据传输过程中容易出现丢包的情况。为了提高网络传输的速度和性能,可以在发送数据时尽量避免丢包。例如,可以通过采用一些更为先进的数据校验算法来减少丢包的概率。
-
接收方尽量避免重复数据
在UDP协议中,数据包的发送和接收是没有任何顺序的。因此,在数据接收过程中,可能会出现重复数据的情况。为了提高网络传输的速度和性能,可以在接收数据时尽量避免重复数据。例如,可以通过维护一个接收窗口来过滤掉重复数据。
开启 TCP Fast Open
TCP Fast Open(TFO)是一种加速 TCP 三次握手的技术。当启用 TFO 时,客户端和服务器之间在进行三次握手时,客户端可以在 SYN 报文中携带数据,这样服务器就可以在收到 SYN 报文时就开始处理请求,从而加快请求的响应速度。
在 Linux 中,可以通过修改 /etc/sysctl.conf 文件来开启 TFO:
net.ipv4.tcp_fastopen=3
开启 BBR 拥塞控制算法
BBR 是 Google 开发的一种拥塞控制算法,可以显著提高网络的吞吐量和延迟。可以通过开启 BBR 拥塞控制算法来提高网络性能。
在 Linux 中,可以通过修改 /etc/sysctl.conf 文件来开启 BBR:
net.core.default_qdisc=fqnet.ipv4.tcp_congestion_control=bbr
TCP/IP 协议栈的零拷贝
传统的 TCP/IP 协议栈在传输数据时,需要将数据从用户空间复制到内核空间,然后再从内核空间复制到网络卡,这个过程被称为“拷贝”。在高并发场景下,大量的拷贝操作会成为瓶颈,影响网络传输的效率。为了解决这个问题,TCP/IP 协议栈的零拷贝技术应运而生。
零拷贝技术的基本思想是:通过让内核空间和用户空间共享同一块内存来避免数据的复制,从而提高网络传输效率。具体实现方式包括:mmap、sendfile 和 splice 等。
mmap
mmap 是一种内存映射技术,它可以将文件或设备的数据映射到进程的虚拟地址空间中,从而实现用户空间和内核空间之间的数据共享。在 Linux 系统中,可以使用 mmap 函数将网络数据映射到用户空间中,然后通过 DMA(直接内存访问)技术将数据发送到网络卡中,从而实现零拷贝。
sendfile
sendfile 是一种高效的文件传输方式,它可以将文件数据直接发送到网络卡,而无需经过内核空间和用户空间的复制。在 Linux 系统中,可以使用 sendfile 函数将文件数据发送到网络卡中,从而实现零拷贝。
splice
splice 是一种高效的数据传输方式,它可以将两个文件描述符之间的数据传输,而无需经过内核空间和用户空间的复制。在 Linux 系统中,可以使用 splice 函数将数据从一个文件描述符传输到另一个文件描述符中,从而实现零拷贝。
总结
在使用TCP/IP协议栈加速技术时,也需要注意一些调整参数。以下是一些常见的可调整参数:
-
TCP连接数限制:通过调整
/proc/sys/net/ipv4/tcp_max_syn_backlog
参数可以调整TCP连接数的限制,从而避免TCP连接被阻塞。 -
内存限制:TCP/IP协议栈需要大量的内存来缓存数据,因此需要通过调整
/proc/sys/net/core/rmem_max
和/proc/sys/net/core/wmem_max
参数来限制协议栈可以使用的内存大小。 -
时间限制:TCP/IP协议栈需要定期清除过期的数据,因此需要通过调整
/proc/sys/net/ipv4/tcp_keepalive_time
参数来设置TCP连接的超时时间,从而避免过期数据占用内存。 -
接收缓存大小:通过调整
/proc/sys/net/core/rmem_default
参数可以设置TCP接收缓存的大小,从而提高TCP接收数据的速度。 -
发送缓存大小:通过调整
/proc/sys/net/core/wmem_default
参数可以设置TCP发送缓存的大小,从而提高TCP发送数据的速度。 -
TCP拥塞控制算法:TCP拥塞控制算法可以根据网络拥塞情况自动调整数据发送速率。Linux内核支持多种TCP拥塞控制算法,可以通过
/proc/sys/net/ipv4/tcp_congestion_control
参数来设置。 -
TCP窗口大小:通过调整
/proc/sys/net/ipv4/tcp_window_scaling
参数可以启用TCP窗口缩放功能,从而提高TCP传输数据的速度。
相关文章:
高并发下的linux优化
针对高并发服务,对 Linux 内核和网络进行优化可以提高系统的性能和稳定性。本文将深入探讨如何对 Linux 内核和网络进行优化,包括调整内核参数、调整网络性能参数、使用 TCP/IP 协议栈加速技术、下面将介绍一些可用于优化Linux内核和网络的技术ÿ…...

不同设备使用同一个Git账号
想要在公司和家里的电脑上用同一个git账号来pull, push代码 1. 查看原设备的用户名和邮箱 第1种方法, 依次输入 git config user.name git config user.email第2种方法, 输入 cat ~/.gitconfig2. 配置新设备的用户名和邮箱 用户名和邮箱与原设备保持…...

蓝桥杯算法题:区间移位
题目描述 数轴上有n个闭区间:D1,...,Dn。 其中区间Di用一对整数[ai, bi]来描述,满足ai < bi。 已知这些区间的长度之和至少有10000。 所以,通过适当的移动这些区间,你总可以使得他们的“并”覆盖[0, 10000]——也就是说[0, 100…...

提取word文档里面的图片
大家好,我是阿赵。 阿赵我写博客的时候的习惯是,先用word文档写好,然后再把word文档里面的图片另存,最后再在博客里面复制正文和上传图片。 而我写的文章一般配图都比较多,所以经常要做的一个功能就是另存图片…...

MybatisPlus总结
一、MyBatis回顾 (1)什么是MyBatis:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映…...

使用 mitmproxy 抓包 grpc
昨天在本地执行 grpc 的 quick start(python版本的),我了解 grpc 内部使用的是 HTTP2,所以我就想着抓包来试试,下面就来记录一下这个过程中的探索。 注意:我的电脑上面安装了 Fiddler Classic,…...
【解决Jetson Nano 内存不足问题】纯命令行将 Conda 环境迁移到 SD 卡
前言 Jetson Nano 板载只有 16GB 的存储空间,在安装完 Ubuntu 和 Conda 环境后,剩余空间就捉襟见肘了,无法满足安装 PyTorch 等大型包的需求。此时如果你有一张SD卡,那么可以考虑将 Conda 环境迁移到 SD 卡上。 但网上的教程基本…...

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(七)- 向量算术指令格式
1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容: 这是一份关于向量扩展的详细技术文档,内容覆盖了向量指令集的多个关键方面,如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…...

顺序表的应用
文章目录 目录1. 基于动态顺序表实现通讯录项目2.顺序表经典算法2.1 [移除元素](https://leetcode.cn/problems/remove-element/description/)2.2 [合并两个有序数组](https://leetcode.cn/problems/merge-sorted-array/description/) 3. 顺序表的问题及思考 目录 基于动态顺序…...
2024-04-03-代码随想录算法训练营第一天[LeetCode704二分查找、LeetCode27移除元素]
文章目录 第一题解法一[左闭右开]解法二[左闭右闭]总结 第二题解法一[暴力解法]解法二[双指针法]总结 第一题 LeetCode704二分查找 解法一[左闭右开] class Solution { public:int search(vector<int>& nums, int target) {int size nums.size();int right size…...
[Go运行问题]/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_xx‘ not found
问题描述 在一台ubuntu 20的机器上通过go 编译生成的可执行程序(使用了cgo),在其他ubuntu机器上运行时出现如下问题 /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32 not found 问题分析 因为go代码里的依赖库使用到了sndfile,它必须使用cgo了…...

matrix-breakout-2-morpheus 靶机渗透
信息收集: 1.nmap存活探测: nmap -sn -r 192.168.10.1/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-06 12:13 CST Nmap scan report for 192.168.10.1 Host is up (0.00056s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap…...

爬虫 新闻网站 以湖南法治报为例(含详细注释) V1.0
目标网站:湖南法治报 爬取目的:为了获取某一地区更全面的在湖南法治报已发布的宣传新闻稿,同时也让自己的工作更便捷 环境:Pycharm2021,Python3.10, 安装的包:requests,csvÿ…...

物联网实战--入门篇之(十)安卓QT--后端开发
目录 一、项目配置 二、MQTT连接 三、数据解析 四、数据更新 五、数据发送 六、指令下发 一、项目配置 按常规新建一个Quick空项目后,我们需要对项目内容稍微改造、规划下。 首先根据我们的需要在.pro文件内添加必要的模块,其中quick就是qml了&…...

[Java]网络编程
网络编程概述 计算机网络: 把分布在不同地理区域的具有独立功能的计算机,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统。 Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序…...

重读Java设计模式: 适配器模式解析
引言 在软件开发中,经常会遇到不同接口之间的兼容性问题。当需要使用一个已有的类,但其接口与我们所需的不兼容时,我们可以通过适配器模式来解决这一问题。适配器模式是一种结构型设计模式,它允许接口不兼容的类之间进行合作。本…...
MySQL面试题系列-9
MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据…...

书生·浦语训练营二期第二次笔记
文章目录 1. 部署 InternLM2-Chat-1.8B 模型进行智能对话1.1 配置环境1.2 下载 InternLM2-Chat-1.8B 模型 2. 实战:部署实战营优秀作品 八戒-Chat-1.8B 模型2.1 配置基础环境2.2 使用 git 命令来获得仓库内的 Demo 文件:2.3 下载运行 Chat-八戒 Demo 3. …...

python_3
文章目录 题目运行结果模式A模式B模式C模式D 题目 mode input("请选择模式:") n int(input("请输入数字:"))if mode "A" or mode "a":# 模式A n:输入的层数 i:当前的层数# 每行数字循环次数 ifor i in range(1, n 1):for j in r…...
【Python】 使用Apache Tika和Python实现zip、csv、xls等多格式文件文本内容提取
时间的电影 结局才知道 原来大人已没有童谣 最后的叮咛 最后的拥抱 我们红着眼笑 我们都要把自己照顾好 好到遗憾无法打扰 好好的生活 好好的变老 好好假装我 已经把你忘掉 🎵 五月天《好好》 在进行数据分析、搜索引擎优化或任何需要处理大量…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...

水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...