Linux性能调优命令和技巧
Linux性能调优命令和技巧
性能调优概述
Linux性能调优是一个复杂的过程,涉及系统的多个方面,包括CPU、内存、磁盘I/O、网络等。通过合理的性能调优,可以提高系统的响应速度、吞吐量和稳定性,更好地满足应用程序的需求。本文将介绍Linux性能调优中常用的命令和技巧,帮助系统管理员和开发者更有效地优化Linux系统性能。
性能监控工具
系统级监控
top 命令
top命令是最常用的系统监控工具,用于实时显示系统的CPU、内存、进程等信息。
# 启动toptop
# 常用快捷键# P: 按CPU使用率排序# M: 按内存使用率排序# T: 按运行时间排序# 1: 显示所有CPU核心# k: 终止进程# q: 退出
# 批处理模式top -b -n 1
# 显示特定用户的进程top -u username
# 显示特定进程top -p PIDhtop 命令
htop是top的增强版,提供了更友好的界面和更多功能。
# 安装htopsudo apt install htop # Debian/Ubuntusudo yum install htop # RHEL/CentOS
# 启动htophtop
# 常用快捷键# F1: 显示帮助# F2: 设置# F3: 搜索进程# F4: 过滤进程# F5: 切换树状视图# F6: 排序# F7: 降低优先级# F8: 提高优先级# F9: 终止进程# F10: 退出
# 显示特定用户的进程htop -u username
# 显示特定进程htop -p PIDvmstat 命令
vmstat命令用于显示虚拟内存、进程、CPU活动等系统信息。
# 显示系统统计信息vmstat
# 每2秒显示一次,共显示5次vmstat 2 5
# 显示详细信息vmstat -a
# 显示磁盘统计信息vmstat -d
# 显示内存统计信息vmstat -m
# 显示进程统计信息vmstat -p /dev/sda1mpstat 命令
mpstat命令用于显示每个CPU核心的使用情况。
# 显示所有CPU核心的使用情况mpstat
# 每2秒显示一次,共显示5次mpstat 2 5
# 显示特定CPU核心的使用情况mpstat -P 0iostat 命令
iostat命令用于显示CPU和磁盘I/O统计信息。
# 显示CPU和磁盘I/O统计信息iostat
# 每2秒显示一次,共显示5次iostat 2 5
# 显示详细的磁盘统计信息iostat -x
# 显示指定磁盘的统计信息iostat -p sdasar 命令
sar命令用于收集、报告和保存系统活动信息。
# 显示CPU使用情况sar
# 每2秒显示一次,共显示5次sar 2 5
# 显示内存使用情况sar -r
# 显示磁盘I/O统计sar -d
# 显示网络统计sar -n DEV
# 显示进程统计sar -q
# 保存系统活动信息sar -o datafile 1 10
# 从数据文件中读取信息sar -f datafile内存监控
free 命令
free命令用于显示系统的内存使用情况。
# 显示内存使用情况free
# 以人类可读的格式显示free -h
# 显示详细信息free -v
# 显示内存总量free -t
# 每2秒显示一次,共显示5次watch -n 2 free -hslabtop 命令
slabtop命令用于显示内核slab分配器的使用情况。
# 启动slabtopslabtop
# 排序选项# -s: 按排序顺序# a: 按活动对象数# b: 按对象数# c: 按缓存大小# l: 按每对象大小# v: 按别墅
# 示例slabtop -s c磁盘I/O监控
iotop 命令
iotop命令用于显示进程的I/O使用情况。
# 安装iotopsudo apt install iotop # Debian/Ubuntusudo yum install iotop # RHEL/CentOS
# 启动iotopiotop
# 常用选项# -o: 只显示有I/O活动的进程# -b: 批处理模式# -n: 显示次数# -d: 刷新间隔
# 示例
iotop -o -b -n 5 -d 1hdparm 命令
hdparm命令用于测试磁盘性能。
# 测试磁盘读取速度sudo hdparm -t /dev/sda
# 测试磁盘缓存读取速度sudo hdparm -T /dev/sda
# 测试磁盘I/O性能sudo hdparm -tT /dev/sdafio 命令
fio命令是一个强大的I/O性能测试工具。
# 安装fiosudo apt install fio # Debian/Ubuntusudo yum install fio # RHEL/CentOS
# 测试随机写入性能fio --name=random-write --ioengine=posixaio --rw=randwrite --bs=4k --size=1G --numjobs=4 --iodepth=16 --runtime=60 --time_based --end_fsync=1
# 测试顺序读取性能fio --name=sequential-read --ioengine=posixaio --rw=read --bs=1m --size=1G --numjobs=4 --iodepth=16 --runtime=60 --time_based --end_fsync=1
# 测试混合读写性能fio --name=random-mix --ioengine=posixaio --rw=randrw --rwmixread=70 --bs=4k --size=1G --numjobs=4 --iodepth=16 --runtime=60 --time_based --end_fsync=1网络监控
iftop 命令
iftop命令用于显示网络接口的带宽使用情况。
# 安装iftopsudo apt install iftop # Debian/Ubuntusudo yum install iftop # RHEL/CentOS
# 启动iftopiftop
# 常用选项# -i: 指定网络接口# -B: 以字节为单位显示# -n: 不解析主机名# -N: 不解析端口号
# 示例iftop -i eth0 -nnethogs 命令
nethogs命令用于显示进程的网络带宽使用情况。
# 安装nethogssudo apt install nethogs # Debian/Ubuntusudo yum install nethogs # RHEL/CentOS
# 启动nethogsnethogs
# 常用选项# -d: 刷新间隔# -v: 显示模式# -p: 混合模式
# 示例nethogs -d 2ss 命令
ss命令用于显示网络连接、套接字等信息,是netstat的替代品。
# 显示所有网络连接ss -a
# 显示TCP连接ss -t
# 显示UDP连接ss -u
# 显示监听状态的端口ss -l
# 显示网络连接和进程ss -tp
# 显示网络连接的详细信息ss -sCPU性能调优
CPU调度
进程优先级
# 查看进程优先级ps -eo pid,comm,nice,cls | grep process_name
# 修改进程优先级(nice值)nice -n 10 command
# 修改运行中进程的优先级renice 10 PID
# 实时调整进程优先级(使用top或htop)# top -> k -> PID -> 输入优先级值CPU亲和性
# 查看进程的CPU亲和性taskset -p PID
# 设置进程的CPU亲和性(只在CPU 0上运行)taskset -c 0 -p PID
# 启动进程时设置CPU亲和性taskset -c 0,1 command内核参数调优
# 查看内核参数sysctl -a | grep cpu
# 临时修改内核参数sysctl kernel.sched_autogroup_enabled=0
# 永久修改内核参数echo "kernel.sched_autogroup_enabled=0" >> /etc/sysctl.confsysctl -p常见CPU性能问题
CPU使用率过高
症状:top命令显示CPU使用率接近100%。
解决方案:
- 找出占用CPU的进程:
top或ps aux --sort=-%cpu | head -n 10 - 分析进程的行为:
strace -p PID - 优化应用程序:检查代码、调整配置
- 增加CPU资源:升级硬件或使用负载均衡
CPU等待I/O
症状:top命令显示wa%(I/O等待)较高。
解决方案:
- 检查磁盘I/O:
iostat -x - 优化磁盘I/O:使用SSD、调整I/O调度器
- 优化应用程序:减少I/O操作、使用缓存
内存性能调优
内存管理
查看内存使用情况
# 查看内存使用情况free -h
# 查看进程内存使用情况ps aux --sort=-%mem | head -n 10
# 查看内核内存使用情况cat /proc/meminfo内存缓存
# 清除页面缓存sync && echo 1 > /proc/sys/vm/drop_caches
# 清除目录项和inode缓存sync && echo 2 > /proc/sys/vm/drop_caches
# 清除所有缓存sync && echo 3 > /proc/sys/vm/drop_caches内核参数调优
# 查看内存相关内核参数sysctl -a | grep vm
# 临时修改内核参数sysctl vm.swappiness=10
# 永久修改内核参数echo "vm.swappiness=10" >> /etc/sysctl.confsysctl -p常见内存性能问题
内存不足
症状:free -h显示可用内存很少,系统使用交换空间。
解决方案:
- 找出占用内存的进程:
ps aux --sort=-%mem | head -n 10 - 优化应用程序:减少内存使用、使用内存缓存
- 增加内存:升级硬件
- 调整交换空间:增加交换分区或交换文件
内存泄漏
症状:进程内存使用持续增长,不会释放。
解决方案:
- 检测内存泄漏:使用
valgrind、pmap等工具 - 修复应用程序:检查代码、使用内存分析工具
- 重启进程:临时解决问题
磁盘I/O性能调优
磁盘调度器
# 查看当前磁盘调度器cat /sys/block/sda/queue/scheduler
# 修改磁盘调度器(临时)echo deadline > /sys/block/sda/queue/scheduler
# 修改磁盘调度器(永久)echo "echo deadline > /sys/block/sda/queue/scheduler" >> /etc/rc.local
# 常用调度器# noop: 简单的FIFO队列,适合SSD# deadline: 确保请求在一定时间内完成,适合数据库# cfq: 完全公平队列,默认值,适合通用场景文件系统优化
ext4 文件系统
# 挂载选项优化# 编辑/etc/fstab# UUID=... / ext4 defaults,noatime,nodiratime,barrier=0,data=writeback 0 1
# 调整ext4参数sudo tune2fs -o journal_data_writeback /dev/sda1sudo tune2fs -m 1 /dev/sda1 # 设置保留块百分比为1%XFS 文件系统
# 挂载选项优化# 编辑/etc/fstab# UUID=... / xfs defaults,noatime,nodiratime,discard 0 1
# 调整XFS参数sudo xfs_admin -L 128m /dev/sda1 # 设置日志大小
# 碎片整理sudo xfs_fsr /dev/sda1磁盘阵列
# 查看RAID状态sudo mdadm --detail /dev/md0
# 优化RAID参数sudo mdadm --grow /dev/md0 --chunk=64
# 常用RAID级别# RAID 0: 条带化,提高性能,无冗余# RAID 1: 镜像,提高可靠性,性能一般# RAID 5: 分布式奇偶校验,平衡性能和可靠性# RAID 10: 镜像+条带化,性能和可靠性都高常见磁盘I/O性能问题
磁盘I/O等待高
症状:iostat -x显示%iowait较高,iotop显示进程I/O使用率高。
解决方案:
- 优化应用程序:减少I/O操作、使用缓存
- 使用更快的存储:SSD、NVMe
- 调整I/O调度器:根据工作负载选择合适的调度器
- 使用RAID:提高I/O性能和可靠性
- 优化文件系统:调整挂载选项、使用适合的文件系统
磁盘空间不足
症状:df -h显示磁盘使用率接近100%。
解决方案:
- 删除不需要的文件:
find / -type f -size +100M | xargs rm -f - 清理日志文件:
journalctl --vacuum-time=7d - 扩展磁盘空间:添加新磁盘、使用LVM
网络性能调优
网络接口配置
# 查看网络接口配置ip addrifconfig
# 查看网络接口统计ip -s linkifconfig eth0
# 调整网络接口MTUip link set eth0 mtu 9000
# 启用网络接口GRO/GSOethtool -K eth0 gro on gso on
# 调整网络接口缓冲区ethtool -G eth0 rx 4096 tx 4096内核参数调优
# 查看网络相关内核参数sysctl -a | grep net
# 临时修改内核参数sysctl net.core.somaxconn=65535sysctl net.ipv4.tcp_max_syn_backlog=65535sysctl net.ipv4.tcp_fin_timeout=30sysctl net.ipv4.tcp_keepalive_time=300sysctl net.ipv4.tcp_keepalive_probes=5sysctl net.ipv4.tcp_keepalive_intvl=15
# 永久修改内核参数cat >> /etc/sysctl.conf << EOFnet.core.somaxconn=65535net.ipv4.tcp_max_syn_backlog=65535net.ipv4.tcp_fin_timeout=30net.ipv4.tcp_keepalive_time=300net.ipv4.tcp_keepalive_probes=5net.ipv4.tcp_keepalive_intvl=15EOFsysctl -p常见网络性能问题
网络延迟高
症状:ping命令显示延迟较高,网络应用响应慢。
解决方案:
- 检查网络连接:
traceroute、mtr - 优化网络路由:调整路由表
- 减少网络拥塞:使用QoS
- 升级网络设备:使用更高带宽的网络
网络吞吐量低
症状:iperf测试显示吞吐量低于预期。
解决方案:
- 检查网络接口:
ethtool - 调整网络参数:修改内核参数
- 使用更快的网络:千兆网卡、万兆网卡
- 优化应用程序:使用更高效的协议、减少网络请求
应用程序性能调优
Web服务器调优
Nginx
# 查看Nginx配置cat /etc/nginx/nginx.conf
# 优化Nginx配置# 编辑/etc/nginx/nginx.conf
# 常用优化参数# worker_processes auto; # 自动设置工作进程数# worker_connections 1024; # 每个工作进程的最大连接数# multi_accept on; # 同时接受多个连接# use epoll; # 使用epoll事件模型# keepalive_timeout 65; # 保持连接超时时间# gzip on; # 启用gzip压缩
# 重启Nginxsudo systemctl restart nginxApache
# 查看Apache配置cat /etc/apache2/apache2.conf # Debian/Ubuntucat /etc/httpd/conf/httpd.conf # RHEL/CentOS
# 优化Apache配置# 编辑配置文件
# 常用优化参数# StartServers 5 # 启动服务器数量# MinSpareServers 5 # 最小空闲服务器数量# MaxSpareServers 10 # 最大空闲服务器数量# MaxRequestWorkers 150 # 最大请求工作进程数# MaxConnectionsPerChild 0 # 每个子进程的最大连接数
# 重启Apachesudo systemctl restart apache2 # Debian/Ubuntusudo systemctl restart httpd # RHEL/CentOS数据库服务器调优
MySQL/MariaDB
# 查看MySQL配置cat /etc/my.cnf # RHEL/CentOScat /etc/mysql/my.cnf # Debian/Ubuntu
# 优化MySQL配置# 编辑配置文件
# 常用优化参数# [mysqld]# innodb_buffer_pool_size = 1G # InnoDB缓冲池大小# innodb_log_file_size = 256M # InnoDB日志文件大小# innodb_flush_log_at_trx_commit = 2 # 日志刷新策略# max_connections = 100 # 最大连接数# query_cache_size = 0 # 查询缓存大小(推荐禁用)# tmp_table_size = 64M # 临时表大小# max_heap_table_size = 64M # 最大堆表大小
# 重启MySQLsudo systemctl restart mysql # Debian/Ubuntusudo systemctl restart mariadb # RHEL/CentOSPostgreSQL
# 查看PostgreSQL配置cat /etc/postgresql/12/main/postgresql.conf # Debian/Ubuntucat /var/lib/pgsql/12/data/postgresql.conf # RHEL/CentOS
# 优化PostgreSQL配置# 编辑配置文件
# 常用优化参数# shared_buffers = 256MB # 共享缓冲区大小# work_mem = 4MB # 工作内存大小# maintenance_work_mem = 64MB # 维护工作内存大小# effective_cache_size = 1GB # 有效缓存大小# checkpoint_completion_target = 0.9 # 检查点完成目标# max_connections = 100 # 最大连接数
# 重启PostgreSQLsudo systemctl restart postgresql缓存优化
使用内存缓存
# 安装Redissudo apt install redis-server # Debian/Ubuntusudo yum install redis # RHEL/CentOS
# 配置Redis# 编辑/etc/redis/redis.conf
# 常用优化参数# maxmemory 1gb # 最大内存使用# maxmemory-policy allkeys-lru # 内存不足时的淘汰策略# appendonly no # 禁用AOF持久化
# 启动Redissudo systemctl start redissudo systemctl enable redis
# 安装Memcachedsudo apt install memcached # Debian/Ubuntusudo yum install memcached # RHEL/CentOS
# 配置Memcached# 编辑/etc/memcached.conf
# 常用优化参数# -m 64 # 最大内存使用(MB)# -c 1024 # 最大连接数# -p 11211 # 监听端口
# 启动Memcachedsudo systemctl start memcachedsudo systemctl enable memcached系统整体调优
内核参数调优
# 查看所有内核参数sysctl -a
# 常用内核参数调优cat >> /etc/sysctl.conf << EOF# 网络优化net.core.somaxconn=65535net.ipv4.tcp_max_syn_backlog=65535net.ipv4.tcp_fin_timeout=30net.ipv4.tcp_keepalive_time=300net.ipv4.tcp_keepalive_probes=5net.ipv4.tcp_keepalive_intvl=15net.ipv4.tcp_tw_reuse=1net.ipv4.tcp_tw_recycle=0net.ipv4.ip_local_port_range=1024 65535
# 内存优化vm.swappiness=10vm.overcommit_memory=1vm.dirty_background_ratio=5vm.dirty_ratio=10
# 文件系统优化fs.file-max=65535EOF
# 应用内核参数sysctl -p文件描述符限制
# 查看当前文件描述符限制ulimit -n
# 临时修改文件描述符限制ulimit -n 65535
# 永久修改文件描述符限制# 编辑/etc/security/limits.confcat >> /etc/security/limits.conf << EOF* soft nofile 65535* hard nofile 65535root soft nofile 65535root hard nofile 65535EOF
# 编辑/etc/sysctl.confcat >> /etc/sysctl.conf << EOFfs.file-max=65535EOF
# 应用配置sysctl -p系统服务优化
# 查看系统服务状态systemctl list-unit-files --type=service | grep enabled
# 禁用不必要的服务systemctl disable service_namesystemctl stop service_name
# 常用服务优化# 禁用蓝牙systemctl disable bluetoothsystemctl stop bluetooth
# 禁用打印机systemctl disable cupssystemctl stop cups
# 禁用音频systemctl disable alsa-statesystemctl stop alsa-state
# 禁用网络管理器(如果使用静态IP)systemctl disable NetworkManagersystemctl stop NetworkManagersystemctl enable networkingsystemctl start networking性能调优最佳实践
监控先行
- 建立基准:在调优前,收集系统的基准性能数据
- 持续监控:使用多种工具持续监控系统性能
- 识别瓶颈:根据监控数据识别性能瓶颈
- 有针对性调优:针对识别出的瓶颈进行调优
- 验证效果:调优后,验证性能是否改善
循序渐进
- 小步调整:每次只修改一个参数,避免同时修改多个参数
- 记录变更:记录每次修改的参数和值
- 测试验证:修改后进行充分测试,验证性能改善
- 回滚机制:如果调优效果不佳,能够快速回滚到之前的配置
不同工作负载的调优策略
Web服务器
- CPU:使用多核处理器,调整进程数和线程数
- 内存:增加内存,使用内存缓存
- 磁盘I/O:使用SSD,优化文件系统,启用压缩
- 网络:使用千兆或万兆网卡,优化网络参数
数据库服务器
- CPU:使用多核处理器,调整查询计划
- 内存:增加内存,优化缓存大小
- 磁盘I/O:使用RAID,优化文件系统,调整I/O调度器
- 网络:优化网络参数,使用连接池
计算密集型应用
- CPU:使用高性能处理器,调整进程优先级和亲和性
- 内存:增加内存,优化内存使用
- 磁盘I/O:使用SSD,减少I/O操作
- 网络:优化网络参数,减少网络延迟
I/O密集型应用
- CPU:使用多核处理器,调整I/O调度器
- 内存:增加内存,使用内存缓存
- 磁盘I/O:使用RAID,优化文件系统,使用SSD
- 网络:优化网络参数,增加网络带宽
总结
本文介绍了Linux性能调优中常用的命令和技巧,包括性能监控工具、CPU性能调优、内存性能调优、磁盘I/O性能调优、网络性能调优、应用程序性能调优以及系统整体调优等方面的内容。
性能调优是一个持续的过程,需要系统管理员和开发者根据具体的工作负载和硬件环境,采取合适的调优策略。通过合理的性能调优,可以显著提高Linux系统的性能,更好地满足应用程序的需求。
练习
- 使用
top和htop监控系统性能,识别占用资源最多的进程。 - 使用
iostat和iotop监控磁盘I/O性能,识别I/O密集型进程。 - 使用
iftop和nethogs监控网络性能,识别网络密集型进程。 - 调整磁盘调度器,比较不同调度器对磁盘I/O性能的影响。
- 调整内核参数,优化网络性能。
- 配置Redis缓存,提高Web应用的响应速度。
- 优化MySQL配置,提高数据库性能。
- 编写一个性能监控脚本,定期收集系统性能数据。
- 分析系统性能瓶颈,提出针对性的调优方案。
- 比较调优前后的系统性能,验证调优效果。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!