在 Linux 系统的使用过程中,性能优化是一个至关重要的话题。良好的系统性能不仅能提高工作效率,还能降低资源成本。下面,咱们就从 CPU 调度、内存管理到 IO 调优等方面,通过 13 个核心配置案例来深入探讨 Linux 系统性能优化。
一、CPU 调度优化
案例 1:调整 CPU 调度策略
在 Linux 中,CPU 调度策略有多种,如 SCHED_NORMAL、SCHED_FIFO、SCHED_RR 等。SCHED_NORMAL 是普通进程的调度策略,SCHED_FIFO 是先来先服务的实时调度策略,SCHED_RR 是时间片轮转的实时调度策略。 示例(使用 Shell 技术栈):
# 将进程 ID 为 1234 的进程调度策略改为 SCHED_FIFO
chrt -f -p 99 1234
# 注释:chrt 是 Linux 中用于修改进程调度策略和优先级的命令
# -f 表示使用 SCHED_FIFO 调度策略
# -p 表示修改指定进程 ID 的调度策略
# 99 是优先级,范围是 1 - 99,值越大优先级越高
# 1234 是进程 ID
应用场景:当有对实时性要求极高的任务时,如工业控制、音视频处理等,可以将这些任务的调度策略改为实时调度策略。 技术优缺点:优点是能提高特定任务的实时性;缺点是如果实时任务过多,可能会导致普通任务无法得到足够的 CPU 时间,影响系统整体性能。 注意事项:使用实时调度策略时要谨慎,确保系统中有足够的资源来处理实时任务,避免系统出现卡顿或崩溃。
案例 2:调整 CPU 亲和性
CPU 亲和性可以让进程绑定到特定的 CPU 核心上运行,避免进程在不同 CPU 核心之间频繁迁移,减少缓存失效带来的性能损失。 示例(使用 Shell 技术栈):
# 将进程 ID 为 5678 的进程绑定到 CPU 核心 0 上
taskset -pc 0 5678
# 注释:taskset 是用于设置进程 CPU 亲和性的命令
# -p 表示修改指定进程 ID 的 CPU 亲和性
# -c 表示使用 CPU 核心编号
# 0 是 CPU 核心编号,从 0 开始
# 5678 是进程 ID
应用场景:对于一些对缓存命中率要求较高的应用,如数据库服务器、大数据处理程序等,可以将其绑定到特定的 CPU 核心上。 技术优缺点:优点是能提高缓存命中率,减少上下文切换开销;缺点是如果绑定的 CPU 核心负载过高,会影响进程性能。 注意事项:在绑定 CPU 核心时,要考虑系统的 CPU 核心负载情况,避免出现负载不均衡的问题。
二、内存管理优化
案例 3:调整 swappiness 参数
swappiness 参数表示系统将内存数据交换到磁盘交换空间(swap)的倾向程度,取值范围是 0 - 100。值越大,系统越倾向于使用交换空间;值越小,系统越倾向于保留内存数据。 示例(使用 Shell 技术栈):
# 临时将 swappiness 参数设置为 10
sysctl vm.swappiness=10
# 注释:sysctl 是用于动态修改内核参数的命令
# vm.swappiness 是内核参数,表示 swappiness 值
# 10 是要设置的 swappiness 值
# 永久修改 swappiness 参数
echo "vm.swappiness = 10" >> /etc/sysctl.conf
sysctl -p
# 注释:echo 命令将修改后的参数写入 /etc/sysctl.conf 文件
# sysctl -p 命令使修改后的参数生效
应用场景:当系统内存充足时,可以将 swappiness 参数设置得较低,减少不必要的磁盘 I/O;当系统内存紧张时,可以适当提高 swappiness 参数。 技术优缺点:优点是可以根据系统内存使用情况灵活调整内存交换策略;缺点是如果设置不当,可能会导致系统性能下降。 注意事项:在修改 swappiness 参数时,要结合系统的实际内存使用情况进行调整。
案例 4:优化内存分配策略
Linux 内核提供了多种内存分配策略,如 Buddy 系统、SLAB 分配器等。可以通过调整相关参数来优化内存分配。 示例(使用 Shell 技术栈):
# 调整 SLAB 分配器的缓存压力参数
sysctl vm.slub_max_order=3
# 注释:sysctl 是用于动态修改内核参数的命令
# vm.slub_max_order 是 SLAB 分配器的缓存压力参数
# 3 是要设置的值
应用场景:对于一些对内存分配效率要求较高的应用,如高并发服务器、数据库等,可以通过调整内存分配策略来提高性能。 技术优缺点:优点是能提高内存分配效率,减少内存碎片;缺点是调整不当可能会导致内存使用不合理。 注意事项:在调整内存分配策略参数时,要对系统的内存使用情况有深入了解,避免出现内存泄漏等问题。
三、IO 调优
案例 5:调整磁盘 I/O 调度算法
Linux 支持多种磁盘 I/O 调度算法,如 CFQ(完全公平队列)、NOOP(无操作)、Deadline(截止时间)等。不同的调度算法适用于不同的应用场景。 示例(使用 Shell 技术栈):
# 将 sda 磁盘的 I/O 调度算法改为 Deadline
echo deadline > /sys/block/sda/queue/scheduler
# 注释:echo 命令将 Deadline 调度算法写入 sda 磁盘的调度算法文件
# /sys/block/sda/queue/scheduler 是 sda 磁盘的调度算法文件路径
应用场景:对于数据库服务器等对 I/O 响应时间要求较高的应用,Deadline 调度算法可能更合适;对于顺序读写较多的应用,NOOP 调度算法可能更合适。 技术优缺点:不同的调度算法有不同的优缺点,如 CFQ 算法能保证公平性,但可能会增加 I/O 延迟;Deadline 算法能减少 I/O 延迟,但可能会影响公平性。 注意事项:在选择磁盘 I/O 调度算法时,要根据应用的实际 I/O 特点进行选择。
案例 6:启用磁盘预读功能
磁盘预读功能可以提前将磁盘数据读入内存,减少 I/O 等待时间。 示例(使用 Shell 技术栈):
# 将 sda 磁盘的预读扇区数设置为 2048
blockdev --setra 2048 /dev/sda
# 注释:blockdev 是用于管理块设备的命令
# --setra 表示设置预读扇区数
# 2048 是要设置的预读扇区数
# /dev/sda 是磁盘设备路径
应用场景:对于顺序读写较多的应用,如文件服务器、大数据处理等,启用磁盘预读功能可以提高 I/O 性能。 技术优缺点:优点是能减少 I/O 等待时间,提高顺序读写性能;缺点是如果预读的数据没有被使用,会浪费内存资源。 注意事项:在设置预读扇区数时,要根据应用的实际 I/O 模式进行调整,避免过度预读。
四、网络优化
案例 7:调整 TCP 窗口大小
TCP 窗口大小决定了发送方在未收到确认之前可以发送的数据量,调整 TCP 窗口大小可以提高网络传输性能。 示例(使用 Shell 技术栈):
# 临时调整 TCP 窗口大小参数
sysctl net.ipv4.tcp_window_scaling=1
sysctl net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl net.ipv4.tcp_wmem="4096 65536 16777216"
# 注释:sysctl 是用于动态修改内核参数的命令
# net.ipv4.tcp_window_scaling 表示启用 TCP 窗口缩放功能
# net.ipv4.tcp_rmem 是接收窗口大小参数,分别表示最小值、默认值、最大值
# net.ipv4.tcp_wmem 是发送窗口大小参数,分别表示最小值、默认值、最大值
# 永久修改 TCP 窗口大小参数
echo "net.ipv4.tcp_window_scaling = 1" >> /etc/sysctl.conf
echo "net.ipv4.tcp_rmem = 4096 87380 16777216" >> /etc/sysctl.conf
echo "net.ipv4.tcp_wmem = 4096 65536 16777216" >> /etc/sysctl.conf
sysctl -p
# 注释:echo 命令将修改后的参数写入 /etc/sysctl.conf 文件
# sysctl -p 命令使修改后的参数生效
应用场景:对于高带宽、高延迟的网络环境,如广域网、云计算环境等,调整 TCP 窗口大小可以提高网络传输效率。 技术优缺点:优点是能提高网络传输性能;缺点是如果设置不当,可能会导致网络拥塞。 注意事项:在调整 TCP 窗口大小参数时,要考虑网络的带宽和延迟情况,避免出现网络拥塞。
案例 8:优化网络接口参数
可以通过调整网络接口的一些参数,如 MTU(最大传输单元)、RX/TX 队列长度等,来提高网络性能。 示例(使用 Shell 技术栈):
# 将 eth0 网络接口的 MTU 设置为 9000
ifconfig eth0 mtu 9000
# 注释:ifconfig 是用于配置网络接口的命令
# eth0 是网络接口名称
# mtu 表示设置最大传输单元
# 9000 是要设置的 MTU 值
应用场景:对于需要传输大文件、大数据量的网络环境,如数据中心内部网络,可以增大 MTU 值来提高网络传输效率。 技术优缺点:优点是能提高网络传输效率;缺点是如果网络中存在不支持大 MTU 的设备,可能会导致数据包分片和重组,增加网络开销。 注意事项:在调整网络接口参数时,要确保网络中的所有设备都支持新的参数设置。
五、其他优化
案例 9:调整系统文件描述符限制
在 Linux 系统中,每个进程可以打开的文件描述符数量是有限制的。可以通过调整系统文件描述符限制来满足高并发应用的需求。 示例(使用 Shell 技术栈):
# 临时调整系统文件描述符限制
ulimit -n 65535
# 注释:ulimit 是用于设置用户资源限制的命令
# -n 表示设置文件描述符数量限制
# 65535 是要设置的文件描述符数量
# 永久修改系统文件描述符限制
echo "* hard nofile 65535" >> /etc/security/limits.conf
echo "* soft nofile 65535" >> /etc/security/limits.conf
# 注释:echo 命令将修改后的参数写入 /etc/security/limits.conf 文件
# * 表示对所有用户生效
# hard 和 soft 分别表示硬限制和软限制
# nofile 表示文件描述符数量限制
# 65535 是要设置的文件描述符数量
应用场景:对于高并发的服务器应用,如 Web 服务器、数据库服务器等,需要增加系统文件描述符限制来处理大量的并发连接。 技术优缺点:优点是能满足高并发应用的需求;缺点是如果设置过大,可能会导致系统资源耗尽。 注意事项:在调整系统文件描述符限制时,要根据系统的实际资源情况进行设置。
案例 10:优化系统日志记录
系统日志记录会占用一定的系统资源,尤其是在高并发的情况下。可以通过优化系统日志记录来减少资源消耗。 示例(使用 Shell 技术栈):
# 减少 rsyslog 日志记录的级别
sed -i 's/^\*\.info/&;mail.none;authpriv.none;cron.none/' /etc/rsyslog.conf
systemctl restart rsyslog
# 注释:sed 是用于文本替换的命令
# /etc/rsyslog.conf 是 rsyslog 日志配置文件路径
# systemctl restart rsyslog 命令用于重启 rsyslog 服务
应用场景:对于对系统性能要求较高的服务器,如生产环境的 Web 服务器、数据库服务器等,可以减少不必要的日志记录。 技术优缺点:优点是能减少系统资源消耗;缺点是可能会丢失一些有用的日志信息。 注意事项:在优化系统日志记录时,要根据实际需求保留必要的日志信息。
案例 11:调整内核参数优化系统性能
Linux 内核提供了大量的参数可以调整,通过合理调整这些参数可以优化系统性能。 示例(使用 Shell 技术栈):
# 调整内核参数
echo "net.core.somaxconn = 65535" >> /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog = 65535" >> /etc/sysctl.conf
sysctl -p
# 注释:echo 命令将修改后的参数写入 /etc/sysctl.conf 文件
# net.core.somaxconn 表示监听队列的最大长度
# net.ipv4.tcp_max_syn_backlog 表示 TCP SYN 队列的最大长度
# sysctl -p 命令使修改后的参数生效
应用场景:对于高并发的网络应用,如 Web 服务器、数据库服务器等,调整这些内核参数可以提高系统的并发处理能力。 技术优缺点:优点是能提高系统的并发处理能力;缺点是如果设置不当,可能会导致系统性能下降。 注意事项:在调整内核参数时,要对系统的网络环境和应用特点有深入了解。
案例 12:使用 cgroups 进行资源隔离
cgroups(Control Groups)是 Linux 内核提供的一种资源管理机制,可以对进程或进程组的资源使用进行限制和隔离。 示例(使用 Shell 技术栈):
# 创建一个名为 test_group 的 cgroup
cgcreate -g cpu,memory:/test_group
# 注释:cgcreate 是用于创建 cgroup 的命令
# -g 表示指定要限制的资源类型,这里是 CPU 和内存
# /test_group 是 cgroup 的名称
# 将进程 ID 为 1234 的进程加入到 test_group 中
cgclassify -g cpu,memory:/test_group 1234
# 注释:cgclassify 是用于将进程加入到 cgroup 中的命令
# -g 表示指定要限制的资源类型
# /test_group 是 cgroup 的名称
# 1234 是进程 ID
# 设置 test_group 的 CPU 使用率限制为 50%
echo 50000 > /sys/fs/cgroup/cpu/test_group/cpu.cfs_quota_us
# 注释:echo 命令将 CPU 使用率限制写入 cgroup 的 CPU 配额文件
# /sys/fs/cgroup/cpu/test_group/cpu.cfs_quota_us 是 cgroup 的 CPU 配额文件路径
# 50000 表示 CPU 使用率限制为 50%(单位是微秒)
应用场景:对于多租户环境、容器化环境等,使用 cgroups 可以实现资源的隔离和公平分配。 技术优缺点:优点是能实现资源的隔离和公平分配;缺点是配置和管理相对复杂。 注意事项:在使用 cgroups 时,要对系统的资源使用情况有清晰的了解,避免资源分配不合理。
案例 13:优化磁盘挂载选项
在挂载磁盘时,可以通过调整挂载选项来优化磁盘性能。 示例(使用 Shell 技术栈):
# 挂载磁盘并设置挂载选项
mount -o noatime,nodiratime /dev/sdb1 /mnt/data
# 注释:mount 是用于挂载磁盘的命令
# -o 表示指定挂载选项
# noatime 表示不更新文件的访问时间
# nodiratime 表示不更新目录的访问时间
# /dev/sdb1 是磁盘设备路径
# /mnt/data 是挂载点
应用场景:对于读写频繁的磁盘,如数据库磁盘、日志磁盘等,设置 noatime 和 nodiratime 选项可以减少磁盘 I/O 操作,提高性能。 技术优缺点:优点是能减少磁盘 I/O 操作,提高性能;缺点是可能会影响一些依赖文件访问时间的应用。 注意事项:在设置挂载选项时,要考虑应用的实际需求,避免影响应用的正常运行。
评论