高并发下的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等多格式文件文本内容提取
时间的电影 结局才知道 原来大人已没有童谣 最后的叮咛 最后的拥抱 我们红着眼笑 我们都要把自己照顾好 好到遗憾无法打扰 好好的生活 好好的变老 好好假装我 已经把你忘掉 🎵 五月天《好好》 在进行数据分析、搜索引擎优化或任何需要处理大量…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
