Linux系统性能调优技巧
好的,我会为每个部分加上详细的讲解,帮助你更好地理解和应用这些性能调优技巧。
文件系统优化
深入理解文件系统元数据
1. 元数据布局优化
-
XFS:
- 多日志: XFS 支持多个日志,可以提高元数据操作的并行性。多日志意味着多个日志文件分布在不同的物理设备上,这样可以减少日志操作的竞争,提高性能。
mkfs.xfs -l logdev=/dev/sdb,logdev=/dev/sdc /dev/sda1
- 多分配组: XFS 支持多个分配组,可以提高数据分布的均匀性和并行性。分配组越多,数据分布越均匀,I/O 操作的并行性越好。
mkfs.xfs -d agcount=16 /dev/sda1
- 多日志: XFS 支持多个日志,可以提高元数据操作的并行性。多日志意味着多个日志文件分布在不同的物理设备上,这样可以减少日志操作的竞争,提高性能。
-
ext4:
- 调整块组大小: 块组大小影响文件系统的元数据布局。较大的块组可以减少元数据的数量,提高性能,但会增加碎片。
mkfs.ext4 -G 32768 /dev/sda1
- 调整日志位置: 将日志放在单独的设备上可以减少日志操作对主设备的影响,提高性能。
mkfs.ext4 -L /dev/sdb /dev/sda1
- 调整块组大小: 块组大小影响文件系统的元数据布局。较大的块组可以减少元数据的数量,提高性能,但会增加碎片。
2. 元数据预分配
- fallocate: 可以预先分配文件的空间,减少碎片。这对于大文件和数据库文件特别有用。
fallocate -l 1G /path/to/file
文件系统缓存优化
1. 调整文件系统缓存策略
-
dirty_ratio: 设置脏数据占总内存的比例上限。这个参数决定了内核何时开始将脏数据写回磁盘。较低的值可以减少磁盘 I/O,但可能会影响写性能。
echo 10 > /proc/sys/vm/dirty_ratio
-
dirty_background_ratio: 设置后台脏数据清理开始的比例。这个参数决定了内核何时开始在后台清理脏数据。较低的值可以减少前台进程的等待时间。
echo 5 > /proc/sys/vm/dirty_background_ratio
内存管理
深入理解内存回收机制
1. 调整内存回收阈值
- min_free_kbytes: 设置系统保留的最小空闲内存。这个参数决定了内核何时开始回收内存。较高的值可以减少内存不足的风险,但会减少可用内存。
echo 10240 > /proc/sys/vm/min_free_kbytes
2. 调整内存回收频率
- vfs_cache_pressure: 控制文件系统缓存回收的速度。较高的值会增加文件系统缓存的回收频率,减少缓存占用的内存,但可能会影响文件系统的性能。
echo 50 > /proc/sys/vm/vfs_cache_pressure
内存压缩
1. 使用 zswap
- zswap: 将交换数据压缩后存储在内存中,减少磁盘 I/O。这对于内存有限的系统特别有用。
echo 1 > /sys/module/zswap/parameters/enabled
CPU调度
深入理解 CPU 调度器
1. 调整 CPU 调度器参数
- sched_features: 控制调度器的行为。例如,禁用高分辨率定时器可以减少调度器的开销。
echo NO_HRTICK > /sys/kernel/debug/sched_features
2. 使用隔离 CPU
- isolcpus: 在引导参数中指定隔离的 CPU 核心,防止其他进程抢占这些核心。这对于需要高性能的任务特别有用。
GRUB_CMDLINE_LINUX_DEFAULT="quiet isolcpus=1,2,3"
实时调度优化
1. 调整实时优先级
- sched_rt_runtime_us: 设置实时进程的 CPU 时间片。这个参数决定了实时进程可以占用多少 CPU 时间。较高的值可以提高实时任务的响应性。
echo 950000 > /proc/sys/kernel/sched_rt_runtime_us
网络性能优化
深入理解 TCP/IP 协议栈
1. 调整 TCP 缓冲区大小
-
tcp_rmem: 设置 TCP 接收缓冲区大小。较大的缓冲区可以减少丢包,提高网络吞吐量。
echo 4096 87380 6291456 > /proc/sys/net/ipv4/tcp_rmem
-
tcp_wmem: 设置 TCP 发送缓冲区大小。较大的缓冲区可以减少重传,提高网络吞吐量。
echo 4096 16384 4194304 > /proc/sys/net/ipv4/tcp_wmem
2. 调整 TCP 快速重传
- tcp_frto: 开启 TCP 快速重传。快速重传可以更快地检测和恢复丢包,提高网络性能。
echo 2 > /proc/sys/net/ipv4/tcp_frto
深入理解网络设备驱动
1. 调整网络设备中断
- ethtool: 调整网络设备的中断聚合和中断亲和性。中断聚合可以减少中断频率,提高性能;中断亲和性可以将中断绑定到特定的 CPU 核心,减少上下文切换。
ethtool -C eth0 rx-usecs 10 ethtool -L eth0 combined 2
2. 使用 RSS(Receive Side Scaling)
- rps_cpus: 设置接收队列的 CPU 亲和性。RSS 可以将网络流量分发到多个 CPU 核心,提高处理能力。
echo 1 > /sys/class/net/eth0/queues/rx-0/rps_cpus
I/O性能优化
深入理解 I/O 调度器
1. 调整 I/O 调度器参数
-
read_expire: 设置读操作的超时时间。较短的超时时间可以提高读操作的响应性。
echo 512 > /sys/block/sda/queue/iosched/read_expire
-
write_expire: 设置写操作的超时时间。较短的超时时间可以提高写操作的响应性。
echo 1024 > /sys/block/sda/queue/iosched/write_expire
2. 使用多队列 I/O 调度器
- BFQ (Budget Fair Queueing): 适合多用户和多任务环境。BFQ 可以公平地分配 I/O 资源,减少饥饿现象。
echo bfq > /sys/block/sda/queue/scheduler
深入理解块设备优化
1. 调整块设备读写策略
- read_ahead_kb: 设置预读量。较大的预读量可以减少磁盘 I/O 次数,提高读性能。
echo 128 > /sys/block/sda/queue/read_ahead_kb
2. 使用 NVMe 设备优化
- nr_requests: 调整 NVMe 设备的请求队列深度。较大的队列深度可以提高并发处理能力。
echo 128 > /sys/block/nvme0n1/queue/nr_requests
监控与分析
深入理解性能分析工具
1. 使用 perf 工具
-
perf record: 记录性能事件。这个命令会收集指定程序的性能数据。
perf record -g myapp
-
perf report: 分析记录的性能数据。这个命令会显示性能数据的详细报告,帮助你找到性能瓶颈。
perf report
2. 使用 SystemTap
- SystemTap: 编写脚本进行动态追踪。SystemTap 可以在运行时插入探针,收集系统的运行信息。
stap -e 'probe kernel.function("sys_read").call { printf("Read called from %s\n", comm) }'
3. 使用 eBPF 工具
- bpftrace: 编写脚本进行动态追踪。bpftrace 使用 eBPF 技术,可以在内核中执行高效的追踪脚本。
bpftrace -e 'tracepoint:syscalls:sys_enter_read { printf("Read called from %s\n", comm) }'
其他高级技术
使用内核模块
1. 调整内核参数
-
somaxconn: 设置最大监听队列长度。较大的值可以减少连接拒绝的情况。
echo 65535 > /proc/sys/net/core/somaxconn
-
tcp_max_syn_backlog: 设置最大 SYN 请求队列长度。较大的值可以减少 SYN 洪水攻击的影响。
echo 2048 > /proc/sys/net/ipv4/tcp_max_syn_backlog
2. 使用内核模块
- ipmi_devintf: 加载 IPMI 设备接口模块。IPMI(Intelligent Platform Management Interface)用于远程管理和监控服务器。
echo ipmi_devintf > /etc/modules-load.d/ipmi.conf
使用容器和虚拟化技术
1. Docker 容器优化
-
资源限制: 设置容器的资源限制。这可以防止某个容器占用过多资源,影响其他容器的性能。
docker run --memory="512m" --cpu-shares="512" myapp
-
优化容器镜像: 使用多阶段构建减少镜像大小。多阶段构建可以将编译和运行环境分开,减少最终镜像的大小。
FROM node:14 AS builder WORKDIR /app COPY . . RUN npm install && npm run build FROM node:14-alpine WORKDIR /app COPY --from=builder /app/dist /app CMD ["node", "app.js"]
2. KVM 虚拟化优化
-
调整虚拟机配置: 使用 virtio 驱动提高 I/O 性能。virtio 是一种半虚拟化驱动,可以显著提高虚拟机的 I/O 性能。
<interface type='network'> <model type='virtio'/> </interface>
-
调整内存配置: 设置内存预留和热插拔。内存预留可以确保虚拟机始终有足够的内存,热插拔可以在运行时动态调整内存。
<memory unit='KiB'>524288</memory> <currentMemory unit='KiB'>524288</currentMemory> <memoryBacking> <hugepages/> </memoryBacking>
性能基准测试
1. 使用基准测试工具
-
fio: 测试磁盘 I/O 性能。fio 是一个灵活的 I/O 测试工具,可以模拟多种 I/O 模式。
fio --name=test --ioengine=sync --rw=read --bs=4k --size=1G --numjobs=4
-
iperf: 测试网络带宽。iperf 是一个网络性能测试工具,可以测量网络的带宽和延迟。
iperf -s # 服务器端 iperf -c <server_ip> # 客户端
2. 使用压力测试工具
- stress-ng: 进行 CPU、内存、I/O 等多方面的压力测试。stress-ng 可以模拟多种负载,帮助你评估系统的性能极限。
stress-ng --cpu 4 --io 4 --vm 4 --vm-bytes 1G --timeout 60s
以上是对每个部分的深入解析和详细讲解。希望这些信息能够帮助你更好地理解和优化 Linux 系统的性能。如果你有任何具体的问题或需要进一步的帮助,请随时告诉我。
原文地址:https://blog.csdn.net/asdfghjjk11111/article/details/143652681
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!