自学内容网 自学内容网

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
      
  • 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)!