Linux系统CPU的性能监控及调优

前言:

性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。尤其是在“糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的日益增加和代码的臃肿,各种性能问题开始纷至沓来。

在系统层面能够影响应用性能的一般包括三个因素:CPU、内存和IO,今天,我们先谈谈CPU性能的监控以及调优。

CPU性能监控

当程序响应变慢的时候,首先使用top、vmstat、ps等命令查看系统的cpu使用率是否有异常,从而可以判断出是否是cpu繁忙造成的性能问题。

其中,主要通过us(用户进程所占的%)这个数据来看异常的进程信息。当us接近100%甚至更高时,可以确定是cpu繁忙造成的响应缓慢。一般说来,cpu繁忙的原因有以下几个:

  • 线程中有无限空循环、无阻塞、正则匹配或者单纯的计算
  • 频繁的gc
  • 多线程频繁的上下文切换

top命令

 

top命令

对于多个或多核cpu,上面的显示则会是多个cpu所占用的百分比总合。如需查看每个核的消耗情况,可在进入top视图后按1,就会按核来显示cpu的使用情况,如上图。

  • us 表示用户进程处理所占的百分比
  • sy 表示为内核线程处理所占的百分比
  • ni 表示被nice命令改变优先级的任务所占的百分比
  • id 表示cpu的空闲时间所占的百分比
  • wa 表示为在执行过程中等待io所占的百分比
  • hi 表示为硬件中断所占的百分比
  • si 表示为软件中断所占的百分比
  • st 表示虚拟cpu等待实际cpu的时间的百分比

vmstat

 

vmstat命令

  • in 每秒CPU的中断次数,包括时间中断
  • cs 每秒上下文切换次数,这个值要越小越好,太大了,要考虑调低线程或者进程的数目。每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
  • us 用户CPU时间。
  • sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
  • id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
  • wt 等待IO CPU时间。

gstat -gcutil

 

如果发现是Java进程CPU占用过高,可以使用这个命令查看进程是不是正在频繁GC,如下图所示。

jstat命令

  • S0 — Heap上的 Survivor space 0 区已使用空间的百分比
  • S1 — Heap上的 Survivor space 1 区已使用空间的百分比
  • E — Heap上的 Eden space 区已使用空间的百分比
  • O — Heap上的 Old space 区已使用空间的百分比
  • P — Perm space 区已使用空间的百分比
  • YGC — 从应用程序启动到采样时发生 Young GC 的次数
  • YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
  • FGC — 从应用程序启动到采样时发生 Full GC 的次数
  • FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
  • GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

问题分析

 

根据上面提供的几个常用命令,定位到问题以后,就可以根据具体问题分析其产生的原因了。

CPU瓶颈表现在两个方面:用户态CPU瓶颈和系统态CPU瓶颈。运行操作系统内核以外的软件时导致的瓶颈为用户态CPU瓶颈,运行操作系统内核的时候导致的瓶颈为系统态CPU瓶颈。

用户态CPU和系统态CPU时间比率在3:1到4:1之间是正常的。如果在有瓶颈的系统中,用户和系统时间比率高于这个区间,就应该分析用户态CPU时间增加的原因。

us过高

 

当us值过高时,表示运行的应用消耗了大部分的cpu。在这种情况下,对于java应用而言,最重要的是找到具体消耗cpu的线程所执行的代码,可以采用如下方法。

1.使用gstat -gcutil查看JVM是否频繁的进行GC。
2.如果根据gcutil查看,GC并不频繁,请根据《当CPU飙高时,它在做什么》提供的方式,查看CPU在执行什么代码,来定位问题。

sy过高

 

当sy值过高时,使用vmstat来查看线程切换次数。很可能是linux花费了更多的时间在进行线程切换。java应用造成这种现象的主要原因是启动的线程比较多, 且这些线程多处于不断的阻塞(例如锁等待,io等待)和执行状态的变化过程中,这就导致了操作系统要不断的切换执行的线程, 产生大量的上下文切换。

在这种情况下,对java应用而言,最重要的是找出不断切换状态的原因, 可采用的方法为通过kill -3 pid 或jstack -l pid的方法dump出java应用程序的线程信息,查看线程的状态信息以及锁信息, 找出等待状态或锁竞争过多的线程。

CPU调优

设置程序执行的优先级

 

可以使用nice和renice设置程序执行的优先级。

格式:nice [-n 数值] 命令nice 指令可以改变程序执行的优先权等级。指令让使用者在执行程序时,指定一个优先等级,称之为 nice 值。 这个数值从最高优先级的-20到最低优先级的19。

负数值只有 root 才有权力使。 一般使用者,也可使用 nice 指令來做执行程序的优先级管理,但只能将nice值越调越高。

使用ulimit限制cpu占用时间

 

注意,ulimit 限制的是当前shell进程以及其派生的子进程。因此可以在脚本中调用ulimit来限制cpu使用时间。 例如,限制tar的cpu占用时间,单位秒。

如果tar占用时间超过了100秒,tar将会退出,这可能会导致打包不完全,因此不推荐使用ulimit对cpu占用时间进行限制。 另外,通过修改系统的/etc/security/limits配置文件,可以针对用户进行限制。

使用程序自带的对cpu使用调整的功能

 

某些程序自带了对cpu使用调整的功能,比如nginx服务器,通过其配置文件,可以为工作进程指定cpu,如下:

这里0001 0010 0100 1000是掩码,分别代表第1、2、3、4颗cpu核心,这就使得cpu的使用比较平均到每个核心上。

使用Nginx时,这种优化方式是比较常见的。

阅读原文

时间: 2024-10-15 11:40:17

Linux系统CPU的性能监控及调优的相关文章

Java生产环境下性能监控与调优详解

第1章 课程介绍(Java秒杀课程老师倾力打造)本章为大家介绍生产环境可能存在的问题和常用的性能监控工具,以及课程能学到什么,课程内容如何安排等,让大家对课程有个全貌的认识,从而更好的学习这门课程.1-1 为什么学习这门课程? 第2章 基于JDK命令行工具的监控本章带大家学习JDK的命令行监控工具的使用,包括jps.jinfo.jstat.jmap.jstack, 并结合MAT实战如何定位内存溢出,实战如何定位死循环和死锁.2-1 JVM的参数类型2-2 查看JVM运行时参数2-3 jstat查

MySQL写压力性能监控与调优

写压力调优:数据库的写.写压力性能监控.写压力调优参数 一.关于DB的写 1.数据库是一个写频繁的系统 2.后台写.写缓存 3.commit需要写入 4.写缓存失效或者写满-->写压力陡增-->写占读的带宽 1.BBU失效 2.写入突然增加.cache满 5.日志写入.脏缓冲区写入 二.写压力性能监控 全面剖析写压力:多维度的对写性能进行监控. 1.OS层面的监控:iostat -x [[email protected] mydata]# iostat -x Linux 2.6.32-642.

一个简单web系统的接口性能分析及调优过程

在测试一个简单系统接口性能压力时,压到一定数量,程序总是崩溃,查看相关机器相关数据时,CPU.内存.IO占用均不高,问题自然出现在其它地方先介绍下系统部件架构 Resin版本为:[[email protected] lib]# java -classpath ./resin.jar com.caucho.VersionResin-3.2.1 (built Fri, 17 Oct 2008 04:11:01 PDT)Copyright(c) 1998-2008 Caucho Technology.

DB2数据库性能监控和调优实践

1.性能调优概述 性能问题的症状 响应时间慢 吞吐量低 资源占用高(CPU.Memory.I/0等) 数据库角度 数据库逻辑设计 数据库物理设计(存储规划) SQL语句 数据库调优关键 I/O最关键 减少I/O 最大化I/O效率 存储规律,物理设计 CPU两个杀手 表扫描 排序 Memory命中率可能会骗人 SQL是一切问题的根源 2.性能调优步骤 明确问题->收集数据->分析数据->细化.定位问题->优化 3.DB2数据库监控工具-db2pd 3.1.监控工具总结 即时监控工具

Tomcat性能监控与调优

tomcat远程debug Tomcat是目前被应用得最多的一款Java Web服务器,很多人都会使用Tomcat来作为项目的服务器.也经常需要在开发的时候对Tomcat进行debug.在本地对Tomcat进行debug相信很多人都会,但如果需要对远程的Tomcat进行debug,相信有部分小伙伴还是没接触过的,而本小节将简单介绍一下如何对Tomcat进行远程debug. Tomcat远程debug是基于 JDWP 协议实现的,关于 JDWP 协议,可参考以下文档: https://www.ib

Java项目性能监控和调优工具-Javamelody的学习总结

1.简介: JavaMelody能够在运行环境监测Java或Java EE应用程序服务器.并以图表的形式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求.sql请求.jsp页面与业务接口方法(EJB3.Spring.Guice)的执行数量,平均执行时间,错误百分比等.图表可以按天,周,月,年或自定义时间段查看. 2.准备: 下载javamelody-1.47.0.jar和jrobin-1.5.9.1.jar,引用到项目中. 3.配置方法: 一般

Tomcat 性能监控及调优

1.性能监控 方式1: /usr/local/tomcat7/conf/tomcat-users.xml 添加如下: <role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="manager-jmx"/> <role rolename="manager-status"/> &l

linux系统CPU内存磁盘监控发送邮件脚本之二

#!/bin/bash export PATH export LANG=zh_CN.UTF-8 # # #top之后输入数字1,可以查看每颗CPU的情况. # # #先配置好mailx邮箱账号密码: #cat>/etc/mail.rc<<"EOF" #set sendcharsets=iso-8859-1,utf-8 #set [email protected] #set smtp=smtp.163.com #set [email protected] #set sm

JVM虚拟机性能监控与调优(JDK命令行、JConsole)

很多资料在介绍JDK命令行工具时并不是在Java8环境下,因此还在使用过时的永久区系列的参数,给一些读者造成困难. Java8使用Metaspace(元空间)代替永久区,对于64位平台,为了压缩JVM对象中的_klass指针的大小,引入了类指针压缩空间(Compressed Class Pointer Space) .关于这点,可以参考博客https://blog.csdn.net/liang0000zai/article/details/51168095. 1. JDK命令行工具 在JDK的开