内核调优通常通过修改内核运行时参数来实现,这些参数的配置文件是 Linux 系统中核心的性能调整点。

内核调优配置文件名称

  1. /etc/sysctl.conf: 这是最传统和主要的内核参数配置文件。系统启动时或手动执行 sysctl -p 命令时会读取并应用其中的设置。
  2. /etc/sysctl.d/*.conf: 这是一个现代的、推荐使用的目录。你可以将不同的调优需求(如网络优化、内存优化)放在单独的 .conf 文件中(例如 99-net-tuning.conf, 99-memory.conf)。这样做的好处是:
    • 模块化: 易于管理和维护不同方面的配置。
    • 避免冲突: 升级系统或软件包时,它们通常会将配置放到 /usr/lib/sysctl.d//run/sysctl.d/,而用户的自定义配置放在 /etc/sysctl.d/ 可以覆盖它们,且不会被升级覆盖掉。
    • 加载顺序: 系统会按字母顺序加载 /etc/sysctl.d//run/sysctl.d//usr/lib/sysctl.d/ 目录下的 .conf 文件,后加载的文件中的参数值会覆盖先加载文件中相同参数的值(因此通常用户自定义文件以 99- 开头确保最后加载)。

如何生效?

  • 修改上述文件后,需要执行以下命令之一使配置生效(无需重启):
    • sysctl -p: 重新加载 /etc/sysctl.conf
    • sysctl -p /etc/sysctl.d/99-my-tuning.conf: 重新加载特定文件。
    • sysctl --system: 重新加载所有配置文件(包括 /etc/sysctl.conf/etc/sysctl.d/*.conf 等)。这是推荐的做法
  • 如果想临时测试参数效果(重启失效),可以直接使用 sysctl -w parameter=value 命令。

常见需要优化的内核参数举例

内核需要优化的参数非常多且高度依赖于具体应用场景(Web服务器、数据库、文件服务器、高并发负载、虚拟化等)。以下是一些非常常见且普遍适用的参数类别和具体例子:

1. 网络性能相关

  • net.core.somaxconn:
    • 作用: 定义系统中每个监听套接字(socket)的最大连接请求队列长度。当服务器瞬间收到大量连接请求时,超过 somaxconn 的请求会被丢弃或忽略。
    • 优化场景: 高并发服务器(Web Server如 Nginx/Apache,数据库等)。默认值通常较低(128 或 1024),对于高并发可能需要提高到 4096 或 8192,甚至更高。
    • 注意: 应用层(如 Nginx 的 listen backlog 参数)也需要相应调整,不能超过内核的这个值。
  • net.ipv4.tcp_max_syn_backlog:
    • 作用: 定义系统中尚未收到客户端最终 ACK 的 SYN 半连接请求的最大队列长度。
    • 优化场景: 防御 SYN Flood 攻击或应对瞬间高 SYN 连接请求。通常需要配合 net.core.somaxconn 调整,建议等于或略大于 somaxconn
  • net.ipv4.tcp_tw_reuse (TIME_WAIT 优化):
    • 作用: 允许内核将处于 TIME_WAIT 状态的套接字重新用于新的 OUTGOING (出站) TCP 连接。默认通常是 0 (禁用)。
    • 优化场景: 服务器需要频繁主动向外部建立大量短连接(例如作为客户端连接后端服务、爬虫等),导致本地端口耗尽(大量 TIME_WAIT 状态)。设置为 1 可以缓解端口压力。注意:主要用于解决主动关闭连接方的问题
  • net.ipv4.tcp_tw_recycle (TIME_WAIT 优化 - 谨慎使用!):
    • 作用: 启用对 TIME_WAIT 套接字的快速回收
    • 风险: 在 NAT 网络环境下极易导致连接问题(如移动客户端通过 NAT 网关访问服务器)。在 Linux 4.10+ 内核中已被移除,现代内核不再建议也不应使用此参数。 优先考虑 tcp_tw_reuse 和增加端口范围。
  • net.ipv4.ip_local_port_range:
    • 作用: 定义本地(作为客户端发起连接时)使用的 TCP/UDP 端口号范围
    • 优化场景: 服务器需要作为客户端发起大量连接时(如代理服务器、微服务调用),默认范围(32768-60999)可能不够用,可以扩大(例如 1024 65000)。注意不要和知名端口(<1024)冲突。
  • net.ipv4.tcp_fin_timeout:
    • 作用: 控制套接字保持在 FIN_WAIT_2 状态的最长时间(秒)。默认通常是 60 秒。
    • 优化场景: 可以适当降低(如 30 秒)以更快释放资源,特别是在连接非常频繁的情况下。但降低过多可能导致连接异常终止。
  • net.core.netdev_max_backlog:
    • 作用: 定义当内核处理网络包的速度跟不上网卡接收速度时,每个网络接口接收队列的最大包数
    • 优化场景: 在网络流量非常大的服务器上,增加此值(如 10000)可以减少因接收队列满而导致的丢包。需要结合 net.core.somaxconn 考虑。

2. 虚拟内存管理相关

  • vm.swappiness:
    • 作用: 控制内核将内存页交换(swap)到磁盘的积极程度。值范围 0-100。值越高,内核越积极地使用交换空间;值越低,内核尽量避免交换,更倾向于回收文件系统缓存(page cache)。默认值通常是 60。
    • 优化场景
      • 数据库服务器/内存密集型应用: 通常建议设置为较低值(如 10 甚至 1 或 0),以尽量减少对性能影响巨大的磁盘交换,优先释放文件缓存。
      • 内存充足但希望更多内存用于缓存: 降低 swappiness
      • 内存不足且希望避免 OOM Killer频繁触发: 可适当提高(但这是治标不治本,加内存才是根本)。
    • 注意: 设置为 0 并不代表完全禁止交换,极端内存压力下还是会发生的。
  • vm.vfs_cache_pressure:
    • 作用: 控制内核回收用于 目录项(dentry) 和 inode 对象缓存积极程度。默认值通常是 100。值越高,回收越积极(释放越快);值越低,回收越保守(保留缓存更久)。
    • 优化场景: 对于文件密集型应用(如文件服务器、Web 静态资源服务器),如果发现 dentryinode 缓存频繁被回收导致文件访问变慢,可以尝试适当降低此值(如 50)。

3. 文件系统相关

  • vm.dirty_background_ratio / vm.dirty_background_bytes:
    • 作用: 当系统中脏页(被修改过但尚未写入磁盘的内存页)占总内存的百分比 (dirty_background_ratio) 或达到指定字节数 (dirty_background_bytes) 时,系统在后台开始写回脏页。
    • 优化场景: 控制后台刷盘的阈值。降低此值(如设为 5 或 10)可以让后台刷盘更早开始,避免脏页累积过多导致后续同步刷盘阻塞应用。...bytes 优先级高于 ...ratio
  • vm.dirty_ratio / vm.dirty_bytes:
    • 作用: 当脏页占总内存的百分比 (dirty_ratio) 或达到指定字节数 (dirty_bytes) 时,生成脏页的应用程序会被阻塞(同步地),直到脏页被写入磁盘一部分为止。
    • 优化场景: 控制应用被阻塞的阈值。增大此值(如 30 或 40)可以减少写入密集型应用(如数据库事务日志写入)被阻塞的频率,提高吞吐,但风险是系统崩溃时丢失的数据增多。...bytes 优先级高于 ...ratio
  • vm.dirty_expire_centisecs:
    • 作用: 定义脏页在内存中可停留的最长时间(以百分之一秒计),超过时间的脏页会被周期性刷盘线程写回磁盘。
    • 优化场景: 控制脏页存活时间。减少此值(如设为 500,即 5 秒)可以减少崩溃时潜在的数据丢失量;增大此值(如 3000,即 30 秒)可能合并更多写操作,减少磁盘I/O次数(适合对数据一致性要求不那么极端实时、且写入非常零碎的场景)。
  • fs.file-max / fs.nr_open:
    • fs.file-max: 系统级别允许打开的文件描述符最大总数。
    • fs.nr_open: 单个进程允许打开的文件描述符最大数。
    • 优化场景: 需要处理大量并发连接或打开大量文件的服务器(数据库、Web服务器、代理服务器)。需要将此值调大(例如设置为几十万甚至上百万),并且同时需要调整用户进程的 ulimit (nofile) 限制

重要提示

  1. 没有万能配置: 最佳配置极其依赖你的具体硬件、工作负载(是 CPU 密集型、内存密集型、网络 I/O 密集型还是磁盘 I/O 密集型?)、应用类型(数据库、Web 服务器、文件服务器、虚拟化宿主机?)。
  2. 循序渐进: 不要一次性修改大量参数。理解每个参数的作用,一次修改一两个,并密切监控系统性能指标(使用 top, vmstat, iostat, netstat, ss, sar, dstat 等工具)和应用表现。
  3. 基准测试: 在应用重要变更前后进行基准测试,量化调整的效果。
  4. 备份: 修改关键配置文件前进行备份。
  5. 默认值: 大多数参数的默认值对于通用场景是合理的。优化通常是为了解决特定负载下的瓶颈。
  6. 文档: 参考内核文档 (/usr/share/doc/kernel-doc-<version>/Documentation/sysctl/ 或在线资源) 了解每个参数的详细描述。
  7. 发行版差异: 不同 Linux 发行版及其不同版本的默认参数值可能有差异。
  8. 监控与验证: 使用 sysctl -a | grep parameter_namecat /proc/sys/path/to/parameter 查看参数的当前运行值。

总结来说,内核调优的核心在于理解 /etc/sysctl.conf/etc/sysctl.d/ 目录下的 .conf 文件的作用,并且根据你的服务器承担的角色(Web服务器、数据库、文件服务器等),有针对性地调整如网络连接数参数 (somaxconn, tcp_max_syn_backlog)、TCP 连接复用参数 (tcp_tw_reuse)、内存交换倾向 (vm.swappiness)、脏页刷盘策略 (dirty_ratio, dirty_background_ratio) 以及文件描述符限制 (file-max) 等关键参数。务必在调整前后进行性能监控和测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98987.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98987.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/98987.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础常见知识点

Java 中 和 equals() 的区别详解_java中与equals的区别及理解-CSDN博客https://blog.csdn.net/m0_64432106/article/details/142026852深入理解Java中方法的参数传递机制 - 悟小天 - 博客园https://www.cnblogs.com/sum-41/p/10799555.html浮点型精度是什么意思&#xff1f;为…

OD C卷 -【高效货运】

文章目录高效货运高效货运 货车的额定载货量为wt&#xff1b;货物A单件重量为wa&#xff0c;单件运费利润为pa;货物B单件重量wb&#xff0c;单件运费利润为pb;每次出车必须包含A、B货物&#xff0c;且单件货物都不可分割&#xff0c;总重量达到额定的载货量wt;每次出车能够获取…

手动解压并读取geo 文件 series_matrix_table_begin series_matrix_table_end之间的数据

手动解压并读取geo 文件 series_matrix_table_begin series_matrix_table_end之间的数据 1. 手动解压并读取文件内容 file_path <- “K:/download/geo/raw_data/GEO/GSE32967_series_matrix.txt.gz” 使用latin1编码读取文件所有行 con <- gzfile(file_path, “r”) all_…

主板硬件研发基础--DP/DP++

现在的主板大多数使用的是比DP功能更加强大的DP++。 DisplayPort++(DP++)是 DisplayPort 技术的增强版,旨在提升与多种视频接口的兼容性和连接性能。以下是关于它的详细介绍: 功能特性 多协议兼容:DP++ 接口不仅支持 DisplayPort 标准的信号传输,还可以通过内部的转换电…

科技行业新闻发布平台哪家好?多场景推广专业方案服务商推荐

面对海量得新闻发布平台和碎片化的传播场景&#xff0c;如何精准选择推广方案无疑是企业主面临的一大难题&#xff0c;对于技术迭代迅速的科技行业更是如此。针对复杂的市场环境&#xff0c;一些专业的新闻发布平台往往能够针对性地给出营销方案&#xff0c;并提供一定技术支持…

SystemVerilog 学习之SystemVerilog简介

SystemVerilog简介SystemVerilog是一种硬件描述和验证语言&#xff08;HDVL&#xff09;&#xff0c;由Accellera开发并于2005年成为IEEE标准&#xff08;IEEE 1800&#xff09;。它在传统Verilog基础上扩展了高级验证和设计功能&#xff0c;广泛应用于数字电路设计、验证及系统…

JavaWeb--day3--AjaxElement路由打包部署

&#xff08;以下内容全部来自上述课程及课件&#xff09; Ajax &#xff08;此章节纯粹演示&#xff0c;因服务器端url链接失效&#xff0c;所以无法实战&#xff09; 1. 同步与异步 同步&#xff1a; 浏览器页面在发送请求给服务器&#xff0c;在服务器处理请求的过程…

IMF GDP的bug

IMF GDP 数据底子是官方数字&#xff0c;基本是沿用官方的&#xff0c;虽然经过修订或估算&#xff0c;存在4大“bug”&#xff1a;1. 依赖官方上报&#xff0c;真实性不保证2. PPP GDP 虚高&#xff0c;居民实际消费力低很多ppp gdp高&#xff0c;甚至gdp高的地方&#xff0c;…

第2篇:数据持久化实战

在上一篇中&#xff0c;我们构建了一个基于内存存储的食谱助手。说实话&#xff0c;内存存储虽然简单&#xff0c;但有个致命问题&#xff1a;程序一重启&#xff0c;数据就全没了。 所以这篇我们要解决数据持久化的问题&#xff0c;将食谱助手从内存存储升级到SQLite数据库。 …

Java推荐系统与机器学习实战案例

基于Java的推荐系统与机器学习实例 以下是一些基于Java的推荐系统与机器学习实例的参考方向及开源项目,涵盖协同过滤、矩阵分解、深度学习等常见方法。内容根据实际项目和技术文档整理,可直接用于学习或开发。 协同过滤实现 用户-物品评分预测 使用Apache Mahout的基于用户…

AI生成内容检测的综合方法论与技术路径

一、AI内容检测技术的分类与原理当前AI内容检测技术主要分为四大类&#xff0c;每类都有其独特的原理和应用场景&#xff1a;1. 基于语言特征分析的检测方法这类方法通过挖掘人类写作与AI生成文本之间的统计学差异进行判断&#xff1a;1.1 词汇使用模式分析AI生成的文本在词汇选…

可可图片编辑 HarmonyOS(5)滤镜效果

可可图片编辑 HarmonyOS&#xff08;5&#xff09;滤镜效果 前言 可可图片编辑也实现了滤镜效果&#xff0c;主要是利用 Image组件的 colorFilter 属性实现。滤镜的关键属性 colorFilter colorFilter 的主要作用是给图像设置颜色滤镜效果。 其核心原理是使用一个 4x5 的颜色矩阵…

< JS事件循环系列【二】> 微任务深度解析:从本质到实战避坑

在上一篇关于 JS 事件循环的文章中&#xff0c;我们提到 “微任务优先级高于宏任务” 这一核心结论&#xff0c;但对于微任务本身的细节并未展开。作为事件循环中 “优先级最高的异步任务”&#xff0c;微任务的执行机制直接影响代码逻辑的正确性&#xff0c;比如Promise.then的…

STM32 单片机开发 - SPI 总线

一、SPI 总线概念SPI 总线 --- Serial Peripheral Interface&#xff0c;即串行外设接口SPI 是摩托罗拉公司设计的一款 串行、同步、全双工总线&#xff1b;SPI 总线是三线 / 四线制总线&#xff0c;分别是&#xff1a;SPI_SCK&#xff08;时钟线&#xff09;、S…

区域医院云HIS系统源码,云医院管理系统源码,云诊所源码

云HIS源码&#xff0c;云医院管理系统源码&#xff0c;云诊所源码&#xff0c;二级专科医院云HIS系统源代码&#xff0c;有演示云HIS&#xff0c;即云医院管理系统&#xff0c;是一种运用云计算、大数据、物联网等新兴信息技术的医疗信息化解决方案。它重新定义了传统的医院信息…

Java基础 9.11

1.第三代日期类前面两代日期类的不足分析JDK 1.0中包含了一个java.uti.Date类&#xff0c;但是它的大多数方法已经在JDK1.1引Calendar类之后被弃用了。而Calendar也存在问题是&#xff1a;可变性&#xff1a;像日期和时间这样的类应该是不可变的偏移性&#xff1a;Date中的年份…

JavaScript 数组过滤方法

在 JavaScript 编程中&#xff0c;数组是最常用的数据结构之一&#xff0c;而数组过滤则是处理数据集合的关键操作。filter() 方法提供了一种高效的方式来从数组中筛选出符合特定条件的元素&#xff0c;返回一个新的数组&#xff0c;而不改变原始数组。这种方法在处理对象数组时…

《sklearn机器学习——数据预处理》离散化

sklearn 数据预处理中的离散化&#xff08;Discretization&#xff09; 离散化是将连续型数值特征转换为离散区间&#xff08;分箱/bins&#xff09;的过程&#xff0c;常用于简化模型、增强鲁棒性、处理非线性关系或满足某些算法对离散输入的要求&#xff08;如朴素贝叶斯、决…

PTA算法简析

ArkAnalyzer源码初步分析I&#xff1a;https://blog.csdn.net/2302_80118884/article/details/151627341?spm1001.2014.3001.5501 首先&#xff0c;我们必须明确 PTA 的核心工作&#xff1a;它不再关心变量的“声明类型”&#xff0c;而是为程序中的每一个变量和每一个对象字段…

Vue 3 中监听多个数据变化的几种方法

1. 使用 watch监听多个 ref/reactive 数据import { ref, watch } from vueexport default {setup() {const count ref(0)const name ref()const user reactive({ age: 20 })// 监听多个数据源watch([count, name, () > user.age], // 数组形式传入多个数据源([newCount, …