当前位置:论坛首页 > Linux面板 > Linux面板教程

Linux内核调优

发表在 Linux面板2022-8-15 16:32 [复制链接] 6 3633

Linux 内核概述
Linux内核是 Linux 操作系统(OS)的主要组件,也是计算机硬件与其进程之间的核心接口。它负责两者之间的通信,还要尽可能高效地管理资源。
之所以称为内核,是因为它在操作系统中就像果实硬壳中的种子一样,并且控制着硬件(无论是电话、笔记本电脑、服务器,还是任何其他类型的计算机)的所有主要功能。

内核的作用是什么?
内核有 4 项工作:
  • 内存管理:追踪记录有多少内存存储了什么以及存储在哪里
  • 进程管理:确定哪些进程可以使用中央处理器(CPU)、何时使用以及持续多长时间
  • 设备驱动程序:充当硬件与进程之间的调解程序/解释程序
  • 系统调用和安全防护:从流程接受服务请求
在正确实施的情况下,内核对于用户是不可见的,它在自己的小世界(称为内核空间)中工作,并从中分配内存和跟踪所有内容的存储位置。用户所看到的内容(例如 Web 浏览器和文件)则被称为用户空间。这些应用通过系统调用接口(SCI)与内核进行交互。

内核在操作系统中的位置
为了更具象地理解内核,不妨将 Linux 计算机想象成有三层结构:
1.硬件:物理机(这是系统的底层结构或基础)是由内存(RAM)、处理器(或 CPU)以及输入/输出(I/O)设备(例如存储、网络和图形)组成的。其中,CPU 负责执行计算和内存的读写操作。
2.Linux 内核:处于操作系统的核心位置。驻留在内存中的软件,用于告诉 CPU 要执行哪些操作。
3.用户进程:这些是内核所管理的运行程序。用户进程共同构成了用户空间。用户进程有时也简称为进程。内核还允许这些进程和服务器彼此进行通信(称为进程间通信或 IPC)。

系统执行的代码通过以下两种模式之一在 CPU 上运行:内核模式或用户模式。在内核模式下运行的代码可以不受限制地访问硬件,而用户模式则会限制 SCI 对 CPU 和内存的访问。内存也存在类似的分隔情况(内核空间和用户空间)。这两个小细节构成了一些复杂操作的基础,例如安全防护、构建容器和虚拟机的权限分隔。

PS:以下是通过自己系统性能而进行调优的,有些参数设置并不一定适合您当前的服务器。

优化文件打开数和打开系统进程数
1.1 使用sysctl -a命令,可以获取查到内核参数是适合你的服务器的最佳参数。可执行命令获取对比下2台机器的参数
1.png 2.png
  1. sysctl -a |grep fs.file-max
复制代码
通过上面截图获取到系统推荐参数,修改编辑/etc/sysctl.conf文件

4.png
  1. fs.max-file = 379290
复制代码
执行下面命令使其生效,以上方式都是用永久方式添加。
  1. sysctl -p
复制代码
max-file 表示系统级别的能够打开的文件句柄的数量。是对整个系统的限制,并不是针对用户的。
ulimit -n 控制进程级别能够打开的文件句柄的数量,提供对shell及其启动的进程的可用文件句柄的控制,这是进程级别的。针对用户

1.2 通常Nginx、PHP一些服务运行日志内提示Too many open files错误,这种一般都是进程级别打开的文件数不足导致的。
修改/etc/security/limits.conf文件: 3.png
  1. * soft nofile 100006
  2. * hard nofile 100002
  3. root soft nofile 100006
  4. root hard nofile 100002
  5. * soft nofile 100006
  6. * hard nofile 100002
  7. root soft nofile 100006
  8. root hard nofile 100002
复制代码
使用sysctl -p命令,使配置生效。以上是永久方式修改,如果是临时修改则执行下面命令
  1. ulimit -n 100001
复制代码
PS:
noproc是代表最大进程数
nofile是代表最大文件打开数


二、网络参数优化
1.1 接收套接字缓冲区大小的默认值(以字节为单位)
  1. net.core.rmem_default = 212992
复制代码
1.2 接收套接字缓冲区大小的最大值(以字节为单位)
  1. net.core.rmem_max = 212992
复制代码
1.3 发送套接字缓冲区大小的最大值
  1. net.core.wmem_max = 212992
复制代码
1.4 用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制
  1. net.core.somaxconn = 1024
复制代码
1.5 当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值
  1. net.core.netdev_max_backlog = 1000
复制代码
1.6 表示系统中最多有多少TCP套接字不被关联到任何一个用户文件句柄上。如果超过这里设置的数字,连接就会复位并输出警告信息。这个限制仅仅是为了防止简单的DoS攻击
  1. net.ipv4.tcp_max_orphans = 16384
复制代码
1.7 表示那些尚未收到客户端确认信息的连接(SYN消息)队列的长度,默认为1024,可加大队列长度为262144,可以容纳更多等待连接的网络连接数。
  1. net.ipv4.tcp_max_syn_backlog = 262144
复制代码
1.8 表示系统同时保持TIME_WAIT套接字的最大数量。如果超过此数,TIME_WAIT套接字会被立刻清除并且打印警告信息。之所以要设定这个限制,纯粹为了抵御那些简单的DoS攻击,不过,过多的TIME_WAIT套接字也会消耗服务器资源,甚至死机。
  1. net.ipv4.tcp_max_tw_buckets = 16384
复制代码
1.9 表示允许系统打开的端口范围,此设置可根据自身要求设置。
  1. net.ipv4.ip_local_port_range = 1024 65500
复制代码

2.以下参数可解决生产环境中的大量连接服务器中TIME_WAIT过多问题
2.1 表示开启TCP连接中TIME_WAIT套接字的快速回收,默认为0,表示关闭
  1. net.ipv4.tcp_tw_recycle = 1
复制代码
2.2 表示允许重用TIME_WAIT状态的套接字用于新的TCP连接,默认为0,表示关闭
  1. net.ipv4.tcp_tw_reuse = 1
复制代码
2.3 当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
  1. net.ipv4.tcp_syncookies = 1
复制代码
2.4 表示系统允许SYN连接的重试次数。为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK包。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量
  1. net.ipv4.tcp_synack_retries = 1
复制代码
2.5 表示在内核放弃建立连接之前发送SYN包的数量
  1. net.ipv4.tcp_syn_retries = 1
复制代码
2.6 减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。
  1. net.ipv4.tcp_fin_timeout = 60
复制代码
2.7 这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置得小一些,可以更快地清理无效的连接
  1. net.ipv4.tcp_keepalive_time = 600
复制代码
2.8 探测消息未获得响应时,重发该消息的间隔时间(秒)。系统默认75秒。
  1. net.ipv4.tcp_keepalive_intvl = 30
复制代码
2.9 选择性应答(SACK)是 TCP 的一项可选特性,可以提高某些网络中所有可用带宽的使用效率
  1. net.ipv4.tcp_sack = 1
复制代码
3.0 打开FACK(Forward ACK) 拥塞避免和快速重传功能
  1. net.ipv4.tcp_fack = 1
复制代码
3.1 如果某个TCP连接在空闲30秒后,内核才发起probe(探查);probe 3次(每次3秒既tcp_keepalive_intvl值)不成功,内核才彻底放弃,认为该连接已失效。
  1. net.ipv4.tcp_keepalive_time = 30
  2. net.ipv4.tcp_keepalive_probes = 3
  3. net.ipv4.tcp_keepalive_intvl = 3
复制代码


以上可优化网络连接数以及防护少量的DDOS攻击,建议DDOS选择高仿应对,性能会比内核参数防护效果会更好。
内核针对内存的调优后续更新,没有实际应用环境。

使用道具 举报 只看该作者 回复
发表于 2023-3-19 11:56:08 | 显示全部楼层
杂货店 发表于 2023-3-18 13:54
2.8 探测消息未获得响应时,重发该消息的间隔时间(秒)。系统默认75秒。
net.ipv4.tcp_keepalive_intvl =  ...

默认值是9,建议设置是5
使用道具 举报 回复 支持 反对
发表于 2023-3-31 18:38:08 | 显示全部楼层
谢花郎 发表于 2023-3-19 11:56
默认值是9,建议设置是5

你好,我有一件事情想咨询你下,就是pkiil怎么在定时任务脚本自动执行命令?
使用道具 举报 回复 支持 反对
发表于 2023-4-1 09:49:28 | 显示全部楼层
宝塔用户_ymxmrr 发表于 2023-3-31 18:38
你好,我有一件事情想咨询你下,就是pkiil怎么在定时任务脚本自动执行命令?
...

帖子回复您了
使用道具 举报 回复 支持 反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

企业版年付运维跟进群

普通问题处理

论坛响应时间:72小时

问题处理方式:排队(仅解答)

工作时间:白班:9:00 - 18:00

紧急问题处理

论坛响应时间:10分钟

问题处理方式:1对1处理(优先)

工作时间:白班:9:00 - 18:00

工作时间:晚班:18:00 - 24:00

立即付费处理

工作时间:09:00至24:00

快速回复 返回顶部 返回列表