Linux系统性能调优与监控
文章目录前言一、系统调优概述1.1 系统调优思路1.2 各子系统之间的依赖关系二、CPU性能监控工具2.1 uptime 命令查看系统平均负载2.2 判断CPU负载是否过高的示例2.3 查看CPU详细信息2.4 使用 top 按 CPU 使用率排序2.4 使用 ps 查看 CPU 使用最多的进程2.5 mpstat命令查看CPU详细使用情况三、内存性能监控工具3.1 free命令查看内存使用情况3.2 查看详细的内存信息3.3 查找内存使用最多的进程四、磁盘I/O监控工具4.1 iostat命令查看IO是否存在瓶颈4.1.1 iostat案例使用 dd 测试磁盘写入4.2 iotop命令查看实时I/O进程五、网络性能监控工具5.1 nload监控实时带宽使用情况5.2 nethogs查看进程网络使用六、系统整体监控工具6.1 vmstat命令查看内存及系统整体运行状态6.2 sar命令记录系统运行状态6.2.1 命令行参数说明6.2.2 常用选项列表七、CPU资源调优7.1 调整进程优先级nice 值7.1.1 nice 值范围与含义7.2 设置 CPU 亲和力taskset八、磁盘IO调优8.1 ulimit 资源限制8.2 测试硬盘速度总结前言本文核心是定位并消除CPU、内存、磁盘、网络等子系统的瓶颈使系统达到平衡状态并提出了“先整体监控定位再具体分析瓶颈最后针对性调优”的完整思路。包含了CPUuptime、top、mpstat、内存free、vmstat、磁盘I/Oiostat、iotop到网络nload、nethogs的监控工具链以及进程优先级调整nice、CPU亲和力绑定taskset和资源限制ulimit等具体调优方法。一、系统调优概述系统调优是通过调整软硬件配置和代码在现有资源下提升性能速度、吞吐量的实践。核心是先定位瓶颈用工具找短板再由易到难调整网络→系统参数→中间件→代码每次只改一项并对比结果避免盲目操作。1.1 系统调优思路第一步观察系统运行状况按照优先级顺序依次检查CPU状态、内存使用情况、磁盘IO、网络流量、应用程序性能第二步分析是否存在瓶颈根据应用需求判断是否存在性能瓶颈第三步采取调优措施采取针对性措施改善性能1.2 各子系统之间的依赖关系各子系统之间是相互依赖、相互影响的一个子系统的高负载可能导致其他子系统出现问题。比如1CPU与内存大量的网页调入请求导致内存队列的拥塞系统会频繁交换数据导致CPU忙于“搬砖”而非处理业务。2CPU与网络网卡的大吞吐量可能导致更多的CPU开销因为每个网络包都需要CPU处理。如果网络中断处理占用过多CPU会严重影响其他业务的执行。3内存与磁盘大量来自内存的磁盘写请求可能导致更多的CPU以及IO问题。内存中的数据最终需要写入磁盘如果磁盘IO缓慢会导致内存中待写入的数据堆积。4内存与CPU当内存不足时内核需要频繁进行内存页的换入换出操作swapping这会消耗大量CPU资源同时产生大量磁盘IO形成恶性循环。二、CPU性能监控工具2.1 uptime 命令查看系统平均负载uptime11:21:32是当前时间。up 35min是系统运行时间 说明此服务器连续运行 35分钟了。2 users是当前登录用户数。load average: 0.00, 0.01, 0.05是系统负载平均值即任务队列的平均长度三个数值分别为 1 分钟、5 分钟、15分钟前到现在的平均值。若1分钟负载值 CPU核心数说明系统可能过载。根据经验法则单核心CPU的load average不要超过3四核心CPU的负载不要超过12其中load average为3意味着平均有3个任务在等待CPU处理。2.2 判断CPU负载是否过高的示例服务器1load average: 0.15, 0.08, 0.011核 → 负载很低正常服务器2load average: 4.15, 6.08, 6.011核 → 负载过高需要关注服务器3load average: 10.15, 10.08, 10.014核 → 负载正常10 12因为4核服务器能承受的合理上限为3x4122.3 查看CPU详细信息cat/proc/cpuinfo#查看CPU详细信息CPU核心数是从0开始计算的2.4 使用 top 按 CPU 使用率排序top命令的输出中各列含义如下PID进程IDUSER进程所属用户PR进程优先级NInice值VIRT虚拟内存大小RES常驻内存大小SHR共享内存大小S进程状态R运行S睡眠D不可中断T停止Z僵尸%CPUCPU使用率%MEM内存使用率TIMECPU累计使用时间COMMAND进程命令top#最常用的进程监控工具按大写P按 CPU 使用率降序排列。2.4 使用 ps 查看 CPU 使用最多的进程ps-aux--sort-pcpu|head-n11#显示前10个使用CPU最多的进程# -aux表示所有进程 --sort -pcpu表示按CPU使用率降序排序参数含义VIRT虚拟内存进程需要的虚拟内存大小包括进程使用的库、代码、数据等。RES常驻内存进程当前实际使用的内存大小不包括swap out的部分。SHR共享内存除了自身进程的共享内存也包括其他进程的共享内存。计算某个进程实际占用物理内存的公式是RES - SHR。2.5 mpstat命令查看CPU详细使用情况mpstat参数说明%usr:用户空间 CPU 使用占比。%nice:低优先级进程使用CPU占比nice值大于0的进程。%sys:内核空间 CPU 使用占比。%iowait:CPU 等待 IO 占比这个值高说明磁盘可能是瓶颈。%irq:CPU处理硬中断占比。%soft:CPU处理软中断占比。%idle:CPU 空闲时间占比最重要越高越好。三、内存性能监控工具3.1 free命令查看内存使用情况free-h#显示详细信息包括buffers和cache字符解释total总内存used已使用内存free完全空闲的内存shared共享内存buff/cache缓冲区/缓存内存available真正可用的内存重要3.2 查看详细的内存信息cat/proc/meminfo3.3 查找内存使用最多的进程方法1运行top然后按大写M可以按内存使用率来排序显示。方法2按照实际使用内存从大到小排序显示所有进程列表ps-aux--sort-rss|head#按物理内存降序-rss表示按实际占用的物理内存排序。加上负号是降序去掉负号就是升序。四、磁盘I/O监控工具4.1 iostat命令查看IO是否存在瓶颈rpm-qsysstat#检查是否安装sysstat因为iostat是sysstat软件包的一部分yuminstall-ysysstat#若未安装sysstat则yum install下载iostat-d-k#只显示磁盘统计信息iostat-d-k-p/dev/sda#显示指定磁盘的统计信息iostat-d-k1#每秒刷新一次iostat-d-k-p/dev/sda15#共采集五次常用参数-d仅显示磁盘统计信息。-k以KB为单位显示每秒的磁盘请求数,默认单位块。-pdevice | ALL 用于显示块设备及系统分区的统计信息。1采样间隔时间单位为秒这里表示每 1 秒采集一次数据5采样次数关键指标kB_read/s每秒从磁盘读入的数据量,单位为K.kB_wrtn/s每秒向磁盘写入的数据量,单位为K.kB_read读入的数据总量,单位为K.kB_wrtn写入的数据总量,单位为K.4.1.1 iostat案例使用 dd 测试磁盘写入ddif/dev/zeroofa.txtbs10Mcount1000#if:输入文件。of:输出文件。bs10M设置每次读写的块大小为 10MB。count1000设置读写的块数量为 1000所以总文件大小是 10MB×100010000MB约 10GBiostat-psda-dk#查看磁盘I/O使用情况4.2 iotop命令查看实时I/O进程问题场景公司服务器运行缓慢但CPU使用率和内存占用均正常主要卡顿出现在启动新程序或打开文件时。此时系统瓶颈可能在哪里解决方案问题通常出在磁盘I/O上。可通过iotop命令检查磁盘读写最频繁的进程。iotop实时监控磁盘I/O使用情况。yuminstall-yiotop iotop-o#显示正在使用磁盘的进程iotop-d2#每2秒刷新一次iotop-o-d1#只显示有IO输出的进程iotop常用快捷键快捷键功能描述左箭头/右箭头切换排序依据的列默认按 IO 使用率排序r反转当前排序顺序升序/降序p切换进程/线程的显示模式显示线程或聚合为进程a切换显示累计 IO 使用量而非实时值q退出iotop工具五、网络性能监控工具5.1 nload监控实时带宽使用情况#安装nloadyuminstallnload-ynload#nload会显示两个方向的流量Incoming入站和Outgoing出站。按左右箭头可以切换查看不同网卡。ab-n100000-c1000http://10.8.0.10/index.html#做ab压测-n 100000指定总请求数为 100000 次。ab 会向目标 URL 发送共计 100000 次 HTTP 请求。# -c 1000设置并发连接数为1000。表示同时有1000个请求并行发送到服务器。# http://10.8.0.10/index.html 目标测试 URL。ab 会针对该地址发起请求测试。5.2 nethogs查看进程网络使用yum-yinstallnethogs#安装 nethogsnethogs#查看进程网络宽带六、系统整体监控工具6.1 vmstat命令查看内存及系统整体运行状态vmstat命令是最常见的Linux/Unix监控工具可以展现给定时间间隔的服务器的状态值包括服务器的CPU使用率MEM内存使用VMSwap虚拟内存交换情况IO读写情况。使用vmstat可以看到整个机器的CPU内存IO的使用情况而不是单单看到各个进程的CPU使用率和内存使用率。 比top命令节省资源。vmstat#查看系统整体状态vmstat15#每秒刷新一次连续显示5次vmstat关键指标Procs进程r等待运行的进程数如果超过CPU核心数的3倍说明CPU繁忙b不可中断睡眠的进程数通常在等待IOMemory内存swpd已使用的虚拟内存大小free空闲的物理内存大小buff用于buffer的内存大小cache用于cache的内存大小Swap交换分区si从磁盘换入内存的量KB/sso从内存换出到磁盘的量KB/s如果si和so长期大于0说明物理内存不够用。IObi从磁盘读入内存的数据量blocks/sbo从内存写入磁盘的数据量blocks/sSystem系统in每秒中断次数cs每秒上下文切换次数CPUus用户态CPU时间百分比sy系统态CPU时间百分比idCPU空闲时间百分比wa等待IO的CPU时间百分比6.2 sar命令记录系统运行状态yuminstall-ysysstat#安装sysstatcat/etc/cron.d/sysstat#查看sar的计划任务6.2.1 命令行参数说明t指定采样间隔必需参数n指定采样次数可选参数默认值为1-o file参数表示将命令结果以二进制格式保存到指定文件中6.2.2 常用选项列表sar-u15# 查看CPU使用情况sar-r15# 查看内存使用情况sar-d15# 查看磁盘IO情况sar-nDEV15# 查看网络接口情况sar-A15# 查看所有信息sar-u25-ocpu.sar# 保存采样数据到文件sar-u-fcpu.sar# 读取历史二进制文件sar-f/var/log/sa/sa16# 查看历史日志重点关注 %iowait 和 %idle1若 %iowait 过高说明硬盘存在 I/O 瓶颈2%idle 较高表示 CPU 空闲但如果系统响应仍然缓慢可能是 CPU 在等待内存分配此时建议增加内存容量3若 %idle 持续低于 10%则表明 CPU 处理能力不足需要优先优化 CPU 资源七、CPU资源调优7.1 调整进程优先级nice 值7.1.1 nice 值范围与含义范围-20最高优先级到 19最低优先级默认值为 0。规律1nice 值越小甚至为负优先级越高系统会更频繁地调度该进程2nice 值越大优先级越低系统会减少对其的 CPU 资源分配。nice-n-5vimb.txt#命令运行前调整nice值ps-eopid,ni,comm|grepvim#查看进程的PID和nice值7.2 设置 CPU 亲和力taskset功能通过将进程绑定到指定 CPU 核心减少上下文切换开销提升性能。yuminstall-yutil-linux taskset-cp103255#查看进程的CPU亲和力taskset-c0vima.txt# 在CPU 0上运行taskset-c1,3vimb.txt# 在CPU 1或3上运行taskset-c0-3vimc.txt# 在任意CPU 0-3上运行八、磁盘IO调优8.1 ulimit 资源限制ulimit是Linux系统用于限制用户或进程使用系统资源的功能。常见的限制包括最大文件数open files、最大进程数max user processes、最大内存大小、最大CPU时间、最大栈大小。常用配置* soft nofile1024000* hard nofile1024000* soft nproc65535* hard nproc65535*表示对 所有用户 生效也可以指定具体用户名如 root 或 www soft软限制警告线超过时系统会警告但允许临时超过直到进程结束 hard硬限制强制线由内核强制执行绝对不能超过软限制不能高于硬限制 nofile限制 打开文件描述符的数量包括文件、网络连接、管道等Linux 中 “一切皆文件” nproc限制 用户能创建的进程 / 线程数量 具体配置的含义 * soft nofile1024000所有用户的 软限制最多可打开1024000个文件描述符超过会警告 * hard nofile1024000所有用户的 硬限制绝对不能打开超过1024000个文件描述符 * soft nproc65535所有用户的 软限制最多可创建65535个进程 / 线程超过会警告 * hard nproc65535所有用户的 硬限制绝对不能创建超过65535个进程 / 线程ulimit-a#查看所有资源限制ulimit-n# 查看 nofile 软限制ulimit-Hn# 查看 nofile 硬限制ulimit-u# 查看 nproc 软限制ulimit-n1024000#临时修改软限制#永久修改vim/etc/security/limits.conf#修改内容* soft nofile1024000* hard nofile1024000root soft nofile1024000root hard nofile10240008.2 测试硬盘速度这是一个用于测试硬盘读取速度的命令主要用于评估磁盘的顺序读取性能hdparm-t--direct/dev/sda#hdparmLinux 下用于查看和调整硬盘参数的工具# -t测试硬盘的缓存读取速度读取数据时会利用硬盘缓存和系统缓存# --direct启用 “直接 IO” 模式跳过系统缓存直接从硬盘读取原始数据更接近真实的物理读取速度# /dev/sda指定要测试的硬盘设备sda 通常是系统的第一个硬盘ddif/dev/zeroof/test.dbfbs1Mcount2000oflagdirect,nonblock参数说明if/dev/zero输入文件空字符流of/test.dbf输出文件bs1M块大小1MBcount2000复制2000次共2GBoflagdirect,nonblock直接IO非阻塞总结系统性能调优是一个系统工程需要全面监控使用各种工具收集系统状态数据综合分析理解各子系统间的相互影响针对性优化根据瓶颈类型采取适当措施