当前位置: 首页 > news >正文

高并发下的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协议栈的加速主要通过以下两种方式实现:

  1. 改进拥塞控制算法

    TCP拥塞控制算法是保证网络传输可靠的重要机制,但是其效率较低。因此,可以通过改进拥塞控制算法来提高网络传输的速度和性能。例如,可以采用一些更为先进的拥塞控制算法,如TCP BBR、TCP Cubic等。

  2. 增加TCP窗口大小

    TCP窗口大小是控制数据传输速度的重要参数。通过增加TCP窗口大小,可以提高网络传输的速度和性能。例如,可以通过调整TCP窗口大小的最大值和初始值来提高网络传输的速度和性能。

UDP协议栈的加速主要通过以下方式实现:

  1. 发送方尽量避免丢包

    由于UDP协议是面向无连接的,因此在数据传输过程中容易出现丢包的情况。为了提高网络传输的速度和性能,可以在发送数据时尽量避免丢包。例如,可以通过采用一些更为先进的数据校验算法来减少丢包的概率。

  2. 接收方尽量避免重复数据

    在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协议栈加速技术时,也需要注意一些调整参数。以下是一些常见的可调整参数:

  1. TCP连接数限制:通过调整/proc/sys/net/ipv4/tcp_max_syn_backlog参数可以调整TCP连接数的限制,从而避免TCP连接被阻塞。

  2. 内存限制:TCP/IP协议栈需要大量的内存来缓存数据,因此需要通过调整/proc/sys/net/core/rmem_max/proc/sys/net/core/wmem_max参数来限制协议栈可以使用的内存大小。

  3. 时间限制:TCP/IP协议栈需要定期清除过期的数据,因此需要通过调整/proc/sys/net/ipv4/tcp_keepalive_time参数来设置TCP连接的超时时间,从而避免过期数据占用内存。

  4. 接收缓存大小:通过调整/proc/sys/net/core/rmem_default参数可以设置TCP接收缓存的大小,从而提高TCP接收数据的速度。

  5. 发送缓存大小:通过调整/proc/sys/net/core/wmem_default参数可以设置TCP发送缓存的大小,从而提高TCP发送数据的速度。

  6. TCP拥塞控制算法:TCP拥塞控制算法可以根据网络拥塞情况自动调整数据发送速率。Linux内核支持多种TCP拥塞控制算法,可以通过/proc/sys/net/ipv4/tcp_congestion_control参数来设置。

  7. TCP窗口大小:通过调整/proc/sys/net/ipv4/tcp_window_scaling参数可以启用TCP窗口缩放功能,从而提高TCP传输数据的速度。

 

 

 

相关文章:

高并发下的linux优化

针对高并发服务,对 Linux 内核和网络进行优化可以提高系统的性能和稳定性。本文将深入探讨如何对 Linux 内核和网络进行优化,包括调整内核参数、调整网络性能参数、使用 TCP/IP 协议栈加速技术、下面将介绍一些可用于优化Linux内核和网络的技术&#xff…...

不同设备使用同一个Git账号

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

蓝桥杯算法题:区间移位

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

提取word文档里面的图片

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

MybatisPlus总结

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

使用 mitmproxy 抓包 grpc

昨天在本地执行 grpc 的 quick start&#xff08;python版本的&#xff09;&#xff0c;我了解 grpc 内部使用的是 HTTP2&#xff0c;所以我就想着抓包来试试&#xff0c;下面就来记录一下这个过程中的探索。 注意&#xff1a;我的电脑上面安装了 Fiddler Classic&#xff0c;…...

【解决Jetson Nano 内存不足问题】纯命令行将 Conda 环境迁移到 SD 卡

前言 Jetson Nano 板载只有 16GB 的存储空间&#xff0c;在安装完 Ubuntu 和 Conda 环境后&#xff0c;剩余空间就捉襟见肘了&#xff0c;无法满足安装 PyTorch 等大型包的需求。此时如果你有一张SD卡&#xff0c;那么可以考虑将 Conda 环境迁移到 SD 卡上。 但网上的教程基本…...

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(七)- 向量算术指令格式

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

顺序表的应用

文章目录 目录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)&#xff0c;在其他ubuntu机器上运行时出现如下问题 /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32 not found 问题分析 因为go代码里的依赖库使用到了sndfile&#xff0c;它必须使用cgo了…...

matrix-breakout-2-morpheus 靶机渗透

信息收集&#xff1a; 1.nmap存活探测&#xff1a; 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

目标网站&#xff1a;湖南法治报 爬取目的&#xff1a;为了获取某一地区更全面的在湖南法治报已发布的宣传新闻稿&#xff0c;同时也让自己的工作更便捷 环境&#xff1a;Pycharm2021&#xff0c;Python3.10&#xff0c; 安装的包&#xff1a;requests&#xff0c;csv&#xff…...

物联网实战--入门篇之(十)安卓QT--后端开发

目录 一、项目配置 二、MQTT连接 三、数据解析 四、数据更新 五、数据发送 六、指令下发 一、项目配置 按常规新建一个Quick空项目后&#xff0c;我们需要对项目内容稍微改造、规划下。 首先根据我们的需要在.pro文件内添加必要的模块&#xff0c;其中quick就是qml了&…...

[Java]网络编程

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

重读Java设计模式: 适配器模式解析

引言 在软件开发中&#xff0c;经常会遇到不同接口之间的兼容性问题。当需要使用一个已有的类&#xff0c;但其接口与我们所需的不兼容时&#xff0c;我们可以通过适配器模式来解决这一问题。适配器模式是一种结构型设计模式&#xff0c;它允许接口不兼容的类之间进行合作。本…...

MySQL面试题系列-9

MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的RDBMS (Relational Database Management System&#xff0c;关系数据…...

书生·浦语训练营二期第二次笔记

文章目录 1. 部署 InternLM2-Chat-1.8B 模型进行智能对话1.1 配置环境1.2 下载 InternLM2-Chat-1.8B 模型 2. 实战&#xff1a;部署实战营优秀作品 八戒-Chat-1.8B 模型2.1 配置基础环境2.2 使用 git 命令来获得仓库内的 Demo 文件&#xff1a;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等多格式文件文本内容提取

时间的电影 结局才知道 原来大人已没有童谣 最后的叮咛 最后的拥抱 我们红着眼笑 我们都要把自己照顾好 好到遗憾无法打扰 好好的生活 好好的变老 好好假装我 已经把你忘掉 &#x1f3b5; 五月天《好好》 在进行数据分析、搜索引擎优化或任何需要处理大量…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

Python的__call__ 方法

在 Python 中&#xff0c;__call__ 是一个特殊的魔术方法&#xff08;magic method&#xff09;&#xff0c;它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时&#xff08;例如 obj()&#xff09;&#xff0c;Python 会自动调用该对象的 __call__ 方法…...

【多线程初阶】单例模式 指令重排序问题

文章目录 1.单例模式1)饿汉模式2)懒汉模式①.单线程版本②.多线程版本 2.分析单例模式里的线程安全问题1)饿汉模式2)懒汉模式懒汉模式是如何出现线程安全问题的 3.解决问题进一步优化加锁导致的执行效率优化预防内存可见性问题 4.解决指令重排序问题 1.单例模式 单例模式确保某…...