看指标练空间,CPU常用命令

看指标练空间,CPU常用命令 看指标Linux操作系统CPU平均负载以前错误的观点CPU使用率和CPU平均负载是一样的负载高了就是CPU使用率高CPU平均负载单位时间内 系统处于可允许状态和不可中断状态的平均进程数就是平均活跃进程数和CPU使用率并没有直接关系可运行状态正在使用CPU或者正在等待CPU的进程用ps aux命令看到的处于R状态 Running 或 Runnable的进程不可中断状态[rootliuliang6RtqFp8fO7pn ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 249676 7572 ? Ss Jun30 14:05 /usr/lib/systemd/systemd --system --deserialize 20 root 2 0.0 0.0 0 0 ? S Jun30 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I Jun30 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I Jun30 0:00 [rcu_par_gp] root 6 0.0 0.0 0 0 ? I Jun30 0:00 [kworker/0:0H-events_highpri] root 9 0.0 0.0 0 0 ? I Jun30 0:00 [mm_percpu_wq] root 10 0.0 0.0 0 0 ? S Jun30 0:10 [ksoftirqd/0] root 11 0.0 0.0 0 0 ? I Jun30 14:40 [rcu_sched] root 12 0.0 0.0 0 0 ? S Jun30 0:01 [migration/0] root 13 0.0 0.0 0 0 ? S Jun30 0:00 [watchdog/0] root 14 0.0 0.0 0 0 ? S Jun30 0:00 [cpuhp/0] root 15 0.0 0.0 0 0 ? S Jun30 0:00 [cpuhp/1] root 16 0.0 0.0 0 0 ? S Jun30 0:01 [watchdog/1] root 17 0.0 0.0 0 0 ? S Jun30 0:01 [migration/1] root 18 0.0 0.0 0 0 ? S Jun30 0:10 [ksoftirqd/1] root 20 0.0 0.0 0 0 ? I Jun30 0:00 [kworker/1:0H-events_highpri] root 21 0.0 0.0 0 0 ? S Jun30 0:00 [cpuhp/2] shd 1846309 0.0 0.1 96668 6720 ? S 02:01 0:00 sshd: root [net] root 1846957 0.0 0.1 271440 4452 pts/0 R 02:01 0:00 ps auxPS 中常见 STAT 状态描述D无法中断的休眠状态通常 IO 阻塞的进程R正在运行或在就绪队列等待调度的进程S可中断休眠状态T进程停止或被追踪调试Z僵尸进程子进程已结束父进程未回收资源高优先级进程n低优先级进程L部分内存页被锁定无法交换到 swaps会话领导进程拥有子进程l多线程进程使用 CLONE_THREADNPTL 线程位于前台后台进程组正处于内核态关键流程中的进程且流程不可打断的比如 等待硬件设备的IO响应为了保证数据的一致性进程向磁盘读写数据时在得到磁盘响应前是不能被其他进程或者中断打断的ps aux命令中 D状态的进程如何查看平均负载 uptimeload average 后的 3个数字就分别代表着 1分钟5分钟15分钟的CPU平均负载查看服务器总逻辑CPU个数cat /proc/cpuinfo | grep processor | wc -l如果平均负载为2那在2个CPU核数是则刚好利用如果是4个CPU核数则有50%的空余rick3rick3s-Mac-mini Gdify % uptime 10:13 up 2 days, 8:13, 2 users, load averages: 9.74 7.82 7.821515分钟的数值差别不大时说明负载很稳定CPU平均负载合理范围常规推荐等于CPU核数即可也看业务场景和历史趋势判断变化方向CPU使用率和平均负载区别CPU使用率CPU非空闲态运行的时间占比反映CPU的繁忙程度 和平均负载不一定完全一致生产系统的CPU总使用率不要超过 7080%比如单核CPU 1s 内非空性态运行时间为0.8s那么它的CPU使用率就是80%双核CPU 1s 内非空闲态运行时间分别为 0.4s和0.6s总体CPU使用率就是 0.4s0.6s/ 1s*250%Linux 的top 命令 查看CPU使用率us(user)CPU 在用户态运行的时间占比通常用户态 CPU 高表示有应用程序比较繁忙数值越高说明 CPU 使用率越高sy(sys)CPU 在内核态运行的时间占比不包括中断内核态 CPU 越低越好数值越高说明 CPU 使用率越高id(idle)CPU 处于空闲态的时间占比CPU 会执行一个特定的虚拟进程名为System Idle Process该数值高说明 CPU 比较空闲wa(iowait)CPU 等待 I/O 操作完成所消耗的时间该指标越低越好如果该值很高说明 I/O 可能存在瓶颈可以用iostat命令进一步分析hi(hardirq)CPU 处理硬中断所花费的时间硬中断一般由外设硬件发出比如键盘控制器、硬件传感器等中断信号发出后CPU 会快速执行对应处理si(softirq)CPU 处理软中断所花费的时间软中断一般由软件程序发出比如网络收发、定时调度等由操作系统内核产生需要快速执行st(steal)CPU 被其他虚拟机占用的时间只出现在虚拟机场景指标过高时需要检查宿主机或其他虚拟机是否异常区别说明CPU 密集型进程指的是进程一直在占用 CPU 进行计算这种场景通常说明程序本身计算量比较大一般要重点关注 CPU 使用率是否过高I/O 密集型进程指的是进程大部分时间都在等待 I/O 操作完成I/O 可以是磁盘读写、网络收发、文件操作等此时 CPU 使用率不一定很高CPU 的效率主要取决于磁盘、磁盘读写请求过多就会导致大量 I/O 等待进程在 CPU 上访问磁盘文件CPU 会向内核发起调用文件的请求内核去磁盘取文件这个时候 CPU 会切换到其他进程或空闲状态任务会转换为不可中断睡眠状态当进程发起 I/O 请求后会进入不可中断睡眠状态这类进程过多会导致 CPU 负载变高但实际 CPU 利用率可能很低大量等待 CPU 的进程调度也会导致平均负载升高此时 CPU 使用率也会比较高拓展CPU 密集型应用也叫计算密集型表示该任务需要大量运算没有阻塞 CPU一直全速运行常见场景视频编码、图像处理、机器学习、模型训练等I/O 密集型应用表示需要大量 I/O 操作大部分时间 CPU 都在等 I/O 完成CPU 使用率低但等待 I/O 会导致平均负载升高常见场景数据库交互、文件上传下载、网络数据传输等判断方法如果进程运行 I/O 操作时启用其他线程继续使用 CPU可以提高 CPU 使用率如果主线程不去多活时间都花在子项目中来回启动切换会造成“压力大但利用率低”的情况生成环境LInux操作系统CPU压测环境准备前言线上 Linux 会存在多个瓶颈问题CPU、内存、I/O 情况等接下来就是需要准备相关工具模拟生产环境出现的多种问题现在准备压测程序让 CPU 产生瓶颈然后进行分析目标分析 Linux 相关性能指标找出 CPU 平均负载升高的进程和原因平均负载升高的主要原因多个进程争抢 CPU等待 I/OCPU 上下文切换思路先看全局找到系统哪个资源有问题是 CPU 问题还是 I/O 问题再看具体进程知道具体是哪个进程导致资源异常核心命令和应用场景sysstat工具包包含mpstat和pidstat后续会详细介绍mpstat多核 CPU 性能分析工具实时查看每个 CPU 的性能指标也可以查看所有 CPU 的平均性能指标pidstat用于查看进程级别的性能指标可以分析进程的 CPU、内存、I/O、上下文切换等指标vmstat用于实时查看系统整体的上下文切换情况也可以查看进程竞争、系统中断次数等信息‘命令安装sysstatGitHub 地址https://github.com/sysstat/sysstat本章采集资料包提供安装步骤yum install gcc -y yum install unzip -y unzip sysstat-master.zip cd sysstat ./configure make sudo make install查看版本pidstat -Vvmstat安装系统时一般会默认自带两个模拟工具介绍和安装stress多进程工具可以模拟 I/O 密集型应用可以模拟 CPU 密集型应用可以模拟多进程等待 CPU 调度场景可以对 CPU、内存、I/O 等情况进行压测安装命令yum install -y epel-release yum install stress -ysysbench 多线程基准测试工具sysbench多线程基准测试工具可以模拟上百个线程并发处理常用于做 CPU、内存、I/O、数据库等性能压测安装命令yum -y install make automake libtool pkgconfig libaio-devel yum -y install mariadb-devel openssl-devel yum -y install postgresql-devel编译安装unzip sysbench-master.zip cd sysbench-master ./autogen.sh ./configure --without-mysql make make install查看版本sysbench --version什么是基准测试 Benchmark Testing基准测试是一种性能测试方法指通过设计科学的测试方法、测试工具和测试系统对某一类测试对象的某项性能指标进行定量和可对比的测试技术人员为了确定当前环境、系统、服务器等性能情况会进行测试也方便在同一环境条件下进行性能优化前后的对比常见测试场景数据库 SQL 语句索引应用代码网络机器硬件配置等核心点测试过程尽可能重复进行每次测试尽量在相同的环境条件下进行除了某项测试变动外其他软件和硬件组件等条件保持一致除了被测系统是处于运行且可测状态外需要尽量避免其他程序或变量影响测试结果Linux性能优化诊断pidstatmpstat详情sysstat 工具包命令mpstatpidstatmpstat全称Multiprocessor Statistics多核 CPU 性能分析程序可以实时查看每个 CPU 的性能指标也可以查看全部 CPU 的平均性能指标使用场景当系统变慢、CPU 平均负载增大时可以用mpstat判断是 CPU 使用率增大还是 I/O 压力增大的情况导致基本格式mpstat [-P {ALL}] [interval] [count]示例命令mpstat -P ALL 2 3这个命令的意思-P {ALL}监控所有 CPU 核心2每隔 2 秒输出一次报告数据3总共输出 3 次参数说明参数说明-P指定监控哪个 CPU范围是 0 ~ (N-1)ALL 表示监控所有 CPUinterval两次采样的间隔时间count总采样次数显示信息说明字段说明CPU全部 CPU 或某个 CPU从 0 开始编号%usr用户态所使用 CPU 时间的百分比可以理解为 CPU 使用率%nicenice 值为负进程的 CPU 时间占比也就是使用 nice 命令对进程进行降级时 CPU 的百分比%sys内核态所使用 CPU 时间的百分比可以理解为 CPU 使用率%iowaitCPU 在等待 I/O 操作完成所消耗的时间该值高表示可能存在 I/O 瓶颈%irq用于硬中断的 CPU 百分比%soft用于软中断的 CPU 百分比%steal虚拟机强制 CPU 等待的时间百分比基本很少关注%guest虚拟机占用 CPU 时间的百分比基本很少关注%gniceCPU 运行 nice guest 虚拟机所花费的时间百分比基本很少关注%idleCPU 空闲并且系统没有未完成的磁盘 I/O 请求的时间百分比如果 CPU 使用率低、iowait 高、idle 低可能是等待 I/O 导致的问题局部命令pidstatpidstat实时查看进程的 CPU、内存、I/O、上下文切换等指标基本格式pidstat [选项] [interval] [count]示例命令pidstat -u 2 3这个命令的意思每隔 2 秒输出一个报告数据一共输出 3 次输出排序pidstat -u | sort -k 8 -rsort排序说明-k指定排序用哪一列这里的例子中是第 8 列%CPU-r倒序排序参数说明参数说明-u默认参数显示各个进程的 CPU 使用统计监控 CPUpidstat 和 pidstat -u -p ALL 是等效的-r显示各个进程的内存使用统计监控内存-d显示各个进程的 I/O 使用情况监控磁盘-p指定进程号比如 pidstat -p 5-w显示每个进程的上下文切换情况-t显示选择任务的线程的统计信息之外的额外信息默认显示信息字段说明PID进程 ID%usr进程在用户态所使用 CPU 时间的百分比可以理解为 CPU 使用率%system进程在内核态所使用 CPU 时间的百分比可以理解为 CPU 使用率%guest进程在虚拟机占用 CPU 的百分比基本很少关注%wait进程等待 CPU 的时间百分比指进程处于就绪队列中等待获得 CPU 调度运行的时间占比%CPU进程占用 CPU 的百分比和 top 命令一样等于用户态 CPU 加内核态 CPU如果是多核 CPU可能会超过 100%CPU处理进程的 CPU 编号Command当前进程对应的命令CPU密集型应用-内核态实战压测工具stressstress多进程工具可以模拟 I/O 密集型应用可以模拟 CPU 密集型应用可以模拟多进程等待 CPU 调度场景可以对 CPU、内存、I/O 等情况进行压测参数说明参数说明--timeout指定运行多少秒--cpu N产生多个处理 sqrt() 函数的 CPU 进程每个进程高频计算随机数的平方根用于模拟 CPU 计算密集型场景--io N产生多个处理 sync() 函数的磁盘 I/O 进程每个进程高频调用 sync()将内存缓冲区刷到磁盘用于模拟 I/O 密集型场景--vm N每个进程高频调用内存分配 malloc() 和内存释放 free() 函数--vm-bytes指定 malloc() 时申请内存的字节数默认 256MB--hdd N产生 N 个高频执行 write() 和 unlink() 函数的进程也就是写入/删除文件属于磁盘 I/O 进程--hdd-bytes每个 hdd worker 进程写的 byte 数默认 1G需求一模拟 CPU 密集型应用系统是 4 核终端一模拟四个 I/O 进程持续 600 秒stress --io 4 --timeout 600s终端二d参数表示高亮显示变化的区域watch -d uptime终端三查看 CPU 使用率情况每 5 秒监控所有 CPU 情况mpstat -P ALL 5终端四查看运行中的进程和任务每 5 秒刷新一次pidstat -u 5宏观思路先看全局找到系统哪个资源有问题是 CPU 问题还是 I/O 问题再看具体进程找到具体是哪个进程导致这个资源有问题详细分析思路全局uptime运行 1 分钟后4 个核的 CPU 负载量比较高mpstat应用场景当系统变慢、CPU 平均负载增大时用来判断是 CPU 使用率增大还是 I/O 压力增大导致多次调用mpstat持续观察平均负载升高内核态 CPU 使用率%sys比较高iowait也有一定数值局部pidstat用来查看进程和任务的使用情况发现stress进程对 CPU 使用率比较高导致 CPU 平均负载增加pidstat -d用来查看 I/O 相关指标%iowait有一定数值但是不高说明当前有 I/O 延迟但是延迟不明显IO密集型应用案例实战压测工具stressstress多进程工具可以模拟 I/O 密集型应用可以模拟 CPU 密集型应用可以模拟多进程等待 CPU 调度场景可以对 CPU、内存、I/O 等情况进行压测参数说明参数说明--timeout指定运行多少秒--cpu N产生多个处理 sqrt() 函数的 CPU 进程每个进程高频计算随机数的平方根用于模拟 CPU 计算密集型场景--io N产生多个处理 sync() 函数的磁盘 I/O 进程每个进程高频调用 sync()将内存缓冲区刷到磁盘用于模拟 I/O 密集型场景--vm N每个进程高频调用内存分配 malloc() 和内存释放 free() 函数--vm-bytes指定 malloc() 时申请内存的字节数默认 256MB--hdd N产生 N 个高频执行 write() 和 unlink() 函数的进程也就是写入/删除文件属于磁盘 I/O 进程--hdd-bytes每个 hdd worker 进程写的 byte 数默认 1Gpidstat -d查看进程 I/O 使用情况用途查看各活动进程的 I/O 使用统计示例命令pidstat -d字段说明字段说明PID进程 IDkB_rd/s每秒从磁盘读取的 KBkB_wr/s每秒写入磁盘的 KBkB_ccwr/s每秒进程被取消的磁盘写的数据量单位是 KBiodelay块 I/O 延迟包括等待同步块 I/O 和换入块 I/O 结束的时间Command当前进程对应的命令需求二模拟 I/O 密集型应用系统是 4 核终端一模拟两个磁盘 I/O 进程持续 600 秒stress --hdd 2 --hdd-bytes 6G --timeout 600s终端二d参数表示高亮显示变化的区域watch -d uptime终端三查看 CPU 使用率情况每 5 秒监控所有 CPU 情况mpstat -P ALL 2 3终端四查看运行中的进程和任务每 5 秒刷新一次pidstat -u 2 3宏观思路先看全局找到系统哪个资源有问题是 CPU 问题还是 I/O 问题再看具体进程找到具体是哪个进程导致这个资源有问题详细分析思路全局uptime运行 1 分钟后4 个核的 CPU 负载量比较高mpstat应用场景当系统变慢、CPU 平均负载增大时用来判断是 CPU 使用率增大还是 I/O 压力增大导致多次调用mpstat持续观察平均负载升高但是 CPU 使用率没有明显变化iowait大于50%并且比较高结论这说明不是 CPU 计算压力导致的问题而是有 I/O 处理说明进程是 I/O 密集型进程频繁进行 I/O 操作导致系统平均负载很高CPU 使用率不高局部ps aux里面stat字段的状态一般是D说明进程在等待 I/O比如磁盘 I/O、网络 I/O 或其他 I/Opidstat查看进程和任务的使用情况发现stress进程对 CPU 使用率不高但是 CPU 平均负载高判断如果不是stress其他进程造成这类影响需要深入分析输出是哪个进程结论CPU 使用率高CPU 平均负载也高CPU 平均负载高CPU 使用率不一定高可能是 I/O 瓶颈