Linux内核是Linux操作系统的核心,负责管理系统资源、硬件抽象、进程调度、内存管理等关键功能。随着技术的进步和应用需求的增加,Linux内核的优化变得愈发重要。通过对内核进行优化,可以提升系统性能、稳定性和安全性,为高负载和高并发的应用场景提供保障。
Linux内核优化步骤如下:
步骤 1: 获取内核源代码
首先,下载Linux内核源代码。你可以从内核官方网站下载指定版本。
- wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.20.tar.xz
- tar -xvf linux-5.4.20.tar.xz
- cd linux-5.4.20
步骤 2: 配置内核
内核配置是优化的关键步骤。你可以使用以下命令启动配置界面:
make menuconfig
关键配置选项:
-
处理器类型和功能:
确保选择了与你的CPU架构相匹配的选项。 -
内存管理:
-
启用高端内存支持 (High Memory Support)。
-
调整交换空间 (Swap Space) 设置。
-
-
调度器和时间频率:
-
选择合适的调度器(如CFS调度器)。
-
设置内核的时间频率 (100Hz, 250Hz, 1000Hz) 根据你的需求选择。
-
-
网络设置:
-
启用高性能网络选项 (如TCP/IP优化)。
-
启用网络安全功能 (如iptables)。
-
-
文件系统:
-
选择适合你的工作负载的文件系统 (如EXT4, XFS, BTRFS)。
-
启用高级文件系统功能 (如日志功能, 文件系统压缩)。
-
步骤 3: 编译和安装内核
配置完成后,编译并安装内核:
- make -j$(nproc)
- make modules_install
- make install
更新引导加载程序:
更新Grub或其他引导加载程序以使用新内核。
update-grub
步骤 4: 优化内核参数
调整内核参数可以进一步优化系统性能。这些参数可以通过/etc/sysctl.conf
文件进行配置。
常见优化参数:
1、虚拟内存:
- vm.swappiness = 10
- vm.dirty_ratio = 15
- vm.dirty_background_ratio = 5
参数解释说明:
1)vm.swappiness
-
描述: 该参数控制内核将数据从物理内存交换到交换空间(swap)的倾向。
-
值范围: 0-100
-
0: 尽量避免使用交换空间,除非绝对必要。
-
100: 更积极地使用交换空间。
-
-
推荐值:
10
,表示在系统内存不足时才会适度使用交换空间,有助于提高系统性能。
2)vm.dirty_ratio
-
描述: 该参数定义了系统中可用内存的百分比,当超过这个值时,所有脏数据(尚未写入磁盘的数据)将被写入磁盘。
-
值范围: 0-100(百分比)
-
推荐值:
15
,表示当脏数据占用系统内存的15%时,系统会开始将这些数据写入磁盘。这有助于平衡内存使用和I/O性能。
3)vm.dirty_background_ratio
-
描述: 该参数定义了系统中可用内存的百分比,当超过这个值时,后台进程将开始异步地将脏数据写入磁盘。
-
值范围: 0-100(百分比)
-
推荐值:
5
,表示当脏数据占用系统内存的5%时,系统会在后台将这些数据写入磁盘。这有助于减少前台应用程序的I/O等待时间,改善系统响应性。
这些参数的配置有助于优化系统的内存管理和磁盘I/O性能:
1)低 vm.swappiness
(10
):减少不必要的内存交换操作,保持系统的响应速度。
2)适中的 vm.dirty_ratio
(15
):防止过多的脏数据积累在内存中,减少写入磁盘时的突发I/O操作。
3)较低的 vm.dirty_background_ratio
(5
):确保系统在后台持续地将脏数据写入磁盘,避免前台应用程序因I/O操作而延迟。通过合理配置这些参数,可以在保持系统响应速度的同时,优化内存和磁盘I/O性能。
2、文件系统:
- fs.file-max = 2097152
参数解释说明:
义了系统允许同时打开的最大文件数。增加此值可以支持更多的并发文件操作,适用于高负载服务器和应用场景,避免因打开文件数达到上限而导致的文件操作错误。
3、网络优化:
- net.core.netdev_max_backlog = 5000
- net.core.somaxconn = 1024
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.tcp_max_syn_backlog = 2048
- net.ipv4.tcp_fin_timeout = 30
- net.ipv4.ip_local_port_range = 1024 65535
参数解释说明:
1)net.core.netdev_max_backlog
-
描述: 定义网络接口接收队列的最大长度。当网络数据包处理速度跟不上接收速度时,这个参数会限制队列的长度。
-
推荐值:
5000
-
适用场景: 适用于高网络流量的服务器,增加此值可以防止丢包。
2)net.core.somaxconn
-
描述: 定义系统中每个端口允许的最大监听队列长度。
-
推荐值:
1024
-
适用场景: 适用于需要处理大量并发连接的服务器应用程序,如Web服务器或数据库服务器,增加此值可以减少连接被拒绝的情况。
3)net.ipv4.tcp_tw_reuse
-
描述: 允许TCP连接在TIME_WAIT状态下被重用。
-
推荐值:
1
(启用) -
适用场景: 适用于需要快速建立和关闭TCP连接的场景,如Web服务器,有助于减少TIME_WAIT状态的连接数。
4)net.ipv4.tcp_max_syn_backlog
-
描述: 定义TCP连接请求(SYN队列)的最大等待队列长度。
-
推荐值:
2048
-
适用场景: 适用于需要处理大量新建TCP连接的服务器,增加此值可以减少连接请求被拒绝的情况。
5)net.ipv4.tcp_fin_timeout
-
描述: 定义TCP连接在发送FIN包后等待对方确认的时间,单位为秒。
-
推荐值:
30
-
适用场景: 适用于需要快速释放连接资源的服务器,减少此值可以更快地释放未完全关闭的连接。
6)net.ipv4.ip_local_port_range
-
描述: 定义本地端口的动态分配范围,包含起始和结束端口。
-
推荐值:
1024 65535
-
适用场景: 适用于需要大量临时端口的服务器应用程序,如负载均衡器和高并发服务器,扩大此范围可以支持更多的并发连接。
应用这些设置:
- sysctl -p
步骤 5: 持续监控和调优
持续监控系统性能,使用工具如top, htop, iotop, netstat, vmstat等,找出瓶颈并进行调整。
常用监控工具:
top 和 htop:监控CPU和内存使用。
iotop:监控磁盘I/O使用情况。
netstat:监控网络连接和流量。
vmstat:监控系统虚拟内存和整体性能。
Linux内核优化是一个复杂而深入的过程,需要结合系统实际需求和硬件环境进行综合考虑。通过合理的优化,可以显著提升系统的性能、稳定性和安全性,为高效运行提供坚实的基础。随着技术的不断发展,新的优化技术和工具也在不断涌现,为内核优化提供了更多可能性和选择。
trolink@SVN:~/samba/Storage/openwrt_trolink/files/etc$ cat sysctl.conf
kernel.panic=3
kernel.core_pattern=/tmp/%e.%t.%p.%s.core
net.ipv4.conf.default.arp_ignore=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.ip_forward=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_responses=1
net.ipv4.igmp_max_memberships=100
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_keepalive_time=120
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_sack=1
net.ipv4.tcp_dsack=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
net.netfilter.nf_conntrack_acct=1
net.netfilter.nf_conntrack_checksum=0
net.netfilter.nf_conntrack_max=16384
net.netfilter.nf_conntrack_tcp_timeout_established=7440
net.netfilter.nf_conntrack_udp_timeout=60
net.netfilter.nf_conntrack_udp_timeout_stream=180
# disable bridge firewalling by default
net.bridge.bridge-nf-call-arptables=0
net.bridge.bridge-nf-call-ip6tables=0
net.bridge.bridge-nf-call-iptables=0
#--------------------------------->
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.default.accept_source_route=1
net.ipv4.conf.all.accept_source_route=1
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.default.secure_redirects=1
net.ipv4.conf.all.secure_redirects=1
net.ipv4.ip_forward=1
net.ipv4.ip_dynaddr=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_responses=1
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_keepalive_time=120
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_keepalive_intvl=10
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_syn_retries=2
net.ipv4.tcp_max_syn_backlog=1024
net.ipv4.tcp_abort_on_overflow=1
net.core.somaxconn=128
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_max_tw_buckets=2048
net.ipv4.tcp_sack=1
net.ipv4.tcp_dsack=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_rfc1337=1
net.ipv4.tcp_ecn=0
net.ipv4.tcp_low_latency=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
net.netfilter.nf_conntrack_acct=1
net.netfilter.nf_conntrack_checksum=0
net.netfilter.nf_conntrack_max=8192
net.netfilter.nf_conntrack_generic_timeout=60
net.netfilter.nf_conntrack_icmp_timeout=10
net.netfilter.nf_conntrack_tcp_timeout_close=10
net.netfilter.nf_conntrack_tcp_timeout_close_wait=20
net.netfilter.nf_conntrack_tcp_timeout_established=600
net.netfilter.nf_conntrack_tcp_timeout_fin_wait=20
net.netfilter.nf_conntrack_tcp_timeout_last_ack=10
net.netfilter.nf_conntrack_tcp_timeout_syn_recv=20
net.netfilter.nf_conntrack_tcp_timeout_syn_sent=30
net.netfilter.nf_conntrack_tcp_timeout_time_wait=20
net.netfilter.nf_conntrack_udp_timeout=60
net.netfilter.nf_conntrack_udp_timeout_stream=180
#----------------------------------->
net.ipv4.tcp_max_tw_buckets=4096
#----------------------------------->
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
#net.core.rmem_default = 262144
#net.core.wmem_default = 262144
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.netdev_max_backlog = 10000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 8192 87380 16777216
net.ipv4.tcp_wmem = 8192 65536 16777216
net.ipv4.tcp_mem = 8388608 12582912 16777216
net.ipv4.tcp_max_syn_backlog = 5120
net.ipv4.tcp_synack_retries = 2
net.ipv4.ip_conntrack_max = 8553600
net.ipv4.netfilter.ip_conntrack_max = 8553600
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 60
net.ipv4.tcp_timestsmps = 0
net.nf_conntrack_max = 16384
net.netfilter.nf_conntrack_max = 16384
net.ipv4.tcp_max_tw_buckets=6144
trolink@SVN:~/samba/Storage/openwrt_trolink/files/etc$