Linux 内核概述 Linux内核是 Linux 操作系统(OS)的主要组件,也是计算机硬件与其进程之间的核心接口。它负责两者之间的通信,还要尽可能高效地管理资源。 之所以称为内核,是因为它在操作系统中就像果实硬壳中的种子一样,并且控制着硬件(无论是电话、笔记本电脑、服务器,还是任何其他类型的计算机)的所有主要功能。
内核的作用是什么?
内核有 4 项工作: 在正确实施的情况下,内核对于用户是不可见的,它在自己的小世界(称为内核空间)中工作,并从中分配内存和跟踪所有内容的存储位置。用户所看到的内容(例如 Web 浏览器和文件)则被称为用户空间。这些应用通过系统调用接口(SCI)与内核进行交互。
内核在操作系统中的位置
为了更具象地理解内核,不妨将 Linux 计算机想象成有三层结构:
1.硬件:物理机(这是系统的底层结构或基础)是由内存(RAM)、处理器(或 CPU)以及输入/输出(I/O)设备(例如存储、网络和图形)组成的。其中,CPU 负责执行计算和内存的读写操作。
2.Linux 内核:处于操作系统的核心位置。驻留在内存中的软件,用于告诉 CPU 要执行哪些操作。
3.用户进程:这些是内核所管理的运行程序。用户进程共同构成了用户空间。用户进程有时也简称为进程。内核还允许这些进程和服务器彼此进行通信(称为进程间通信或 IPC)。
系统执行的代码通过以下两种模式之一在 CPU 上运行:内核模式或用户模式。在内核模式下运行的代码可以不受限制地访问硬件,而用户模式则会限制 SCI 对 CPU 和内存的访问。内存也存在类似的分隔情况(内核空间和用户空间)。这两个小细节构成了一些复杂操作的基础,例如安全防护、构建容器和虚拟机的权限分隔。
PS:以下是通过自己系统性能而进行调优的,有些参数设置并不一定适合您当前的服务器。
一、优化文件打开数和打开系统进程数
1.1 使用sysctl -a命令,可以获取查到内核参数是适合你的服务器的最佳参数。可执行命令获取对比下2台机器的参数
- sysctl -a |grep fs.file-max
复制代码 通过上面截图获取到系统推荐参数,修改编辑/etc/sysctl.conf文件
执行下面命令使其生效,以上方式都是用永久方式添加。
max-file 表示系统级别的能够打开的文件句柄的数量。是对整个系统的限制,并不是针对用户的。
ulimit -n 控制进程级别能够打开的文件句柄的数量,提供对shell及其启动的进程的可用文件句柄的控制,这是进程级别的。针对用户
1.2 通常Nginx、PHP一些服务运行日志内提示Too many open files错误,这种一般都是进程级别打开的文件数不足导致的。
修改/etc/security/limits.conf文件:
- * soft nofile 100006
- * hard nofile 100002
- root soft nofile 100006
- root hard nofile 100002
- * soft nofile 100006
- * hard nofile 100002
- root soft nofile 100006
- root hard nofile 100002
复制代码 使用sysctl -p命令,使配置生效。以上是永久方式修改,如果是临时修改则执行下面命令
PS:
noproc是代表最大进程数
nofile是代表最大文件打开数
二、网络参数优化
1.1 接收套接字缓冲区大小的默认值(以字节为单位)
- net.core.rmem_default = 212992
复制代码 1.2 接收套接字缓冲区大小的最大值(以字节为单位)
- net.core.rmem_max = 212992
复制代码 1.3 发送套接字缓冲区大小的最大值
- net.core.wmem_max = 212992
复制代码 1.4 用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制
- net.core.somaxconn = 1024
复制代码 1.5 当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值
- net.core.netdev_max_backlog = 1000
复制代码 1.6 表示系统中最多有多少TCP套接字不被关联到任何一个用户文件句柄上。如果超过这里设置的数字,连接就会复位并输出警告信息。这个限制仅仅是为了防止简单的DoS攻击
- net.ipv4.tcp_max_orphans = 16384
复制代码 1.7 表示那些尚未收到客户端确认信息的连接(SYN消息)队列的长度,默认为1024,可加大队列长度为262144,可以容纳更多等待连接的网络连接数。
- net.ipv4.tcp_max_syn_backlog = 262144
复制代码 1.8 表示系统同时保持TIME_WAIT套接字的最大数量。如果超过此数,TIME_WAIT套接字会被立刻清除并且打印警告信息。之所以要设定这个限制,纯粹为了抵御那些简单的DoS攻击,不过,过多的TIME_WAIT套接字也会消耗服务器资源,甚至死机。
- net.ipv4.tcp_max_tw_buckets = 16384
复制代码 1.9 表示允许系统打开的端口范围,此设置可根据自身要求设置。
- net.ipv4.ip_local_port_range = 1024 65500
复制代码
2.以下参数可解决生产环境中的大量连接服务器中TIME_WAIT过多问题
2.1 表示开启TCP连接中TIME_WAIT套接字的快速回收,默认为0,表示关闭
- net.ipv4.tcp_tw_recycle = 1
复制代码 2.2 表示允许重用TIME_WAIT状态的套接字用于新的TCP连接,默认为0,表示关闭
- net.ipv4.tcp_tw_reuse = 1
复制代码 2.3 当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭
- net.ipv4.tcp_syncookies = 1
复制代码 2.4 表示系统允许SYN连接的重试次数。为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK包。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量
- net.ipv4.tcp_synack_retries = 1
复制代码 2.5 表示在内核放弃建立连接之前发送SYN包的数量
- net.ipv4.tcp_syn_retries = 1
复制代码 2.6 减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。
- net.ipv4.tcp_fin_timeout = 60
复制代码 2.7 这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置得小一些,可以更快地清理无效的连接
- net.ipv4.tcp_keepalive_time = 600
复制代码 2.8 探测消息未获得响应时,重发该消息的间隔时间(秒)。系统默认75秒。
- net.ipv4.tcp_keepalive_intvl = 30
复制代码 2.9 选择性应答(SACK)是 TCP 的一项可选特性,可以提高某些网络中所有可用带宽的使用效率
3.0 打开FACK(Forward ACK) 拥塞避免和快速重传功能
3.1 如果某个TCP连接在空闲30秒后,内核才发起probe(探查);probe 3次(每次3秒既tcp_keepalive_intvl值)不成功,内核才彻底放弃,认为该连接已失效。
- net.ipv4.tcp_keepalive_time = 30
- net.ipv4.tcp_keepalive_probes = 3
- net.ipv4.tcp_keepalive_intvl = 3
复制代码
以上可优化网络连接数以及防护少量的DDOS攻击,建议DDOS选择高仿应对,性能会比内核参数防护效果会更好。
内核针对内存的调优后续更新,没有实际应用环境。
|