服务器 CPU使用率低 但是load高

等待磁盘IO完成的进程太多,导致等待队列长度过大,体现load过高,但是cpu此时去执行别的任务或者空闲,所以会有CPU使用率低但是load高的情况。
主要有以下几种情况:

1、磁盘读写操作太频繁,导致大量IO等待

CPU的工作效率高于磁盘。
进程在CPU上运行要访问磁盘文件时,CPU会向内核去发起调用文件的指令,让内核去磁盘读取文件。
此时CPU去执行别的任务或者空闲。
这个进程就会变成不可中断睡眠状态,这种读写操作多了,就会有大量的不可中断睡眠状态的进程,导致load高。
优化方法:多使用cache

2、mysql 执行语句没有命中索引

mysql数据存储在磁盘上,查询的时候会把磁盘上的数据加载到内存里。当数据量很大,且查询语句没有命中索引时,就会造成扫描的行数过多致使IO阻塞,导致不可中断睡眠状态的线程越来越多,导致load高。
优化方法:show full processlist 查看等待情况,kill掉等待过长的进程,对响应语句进行优化。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用ssh连接到Linux服务器,通过命令行获取CPU使用率和文件系统使用率。Java可以使用jsch库实现ssh连接。 以下是一个示例代码: ```java import com.jcraft.jsch.*; public class LinuxInfo { public static void main(String[] args) { String host = "your_host"; String user = "your_username"; String password = "your_password"; try { JSch jsch = new JSch(); Session session = jsch.getSession(user, host, 22); session.setPassword(password); session.setConfig("StrictHostKeyChecking", "no"); session.connect(); // 获取CPU使用率 String cpuCommand = "top -bn1 | grep load | awk '{printf \"%.2f\", $(NF-2)}'"; ChannelExec cpuChannel = (ChannelExec) session.openChannel("exec"); cpuChannel.setCommand(cpuCommand); cpuChannel.connect(); InputStream cpuStream = cpuChannel.getInputStream(); byte[] cpuBuffer = new byte[1024]; int cpuBytesRead = cpuStream.read(cpuBuffer); String cpuResult = new String(cpuBuffer, 0, cpuBytesRead); System.out.println("CPU使用率: " + cpuResult.trim()); // 获取关键文件系统使用率(以根目录为例) String fsCommand = "df -h / | awk '{print $5}' | tail -n 1"; ChannelExec fsChannel = (ChannelExec) session.openChannel("exec"); fsChannel.setCommand(fsCommand); fsChannel.connect(); InputStream fsStream = fsChannel.getInputStream(); byte[] fsBuffer = new byte[1024]; int fsBytesRead = fsStream.read(fsBuffer); String fsResult = new String(fsBuffer, 0, fsBytesRead); System.out.println("关键文件系统使用率: " + fsResult.trim()); cpuChannel.disconnect(); fsChannel.disconnect(); session.disconnect(); } catch (JSchException | IOException e) { e.printStackTrace(); } } } ``` 其中,`cpuCommand`和`fsCommand`分别是获取CPU使用率和文件系统使用率的命令。使用`ChannelExec`发送命令,并通过`InputStream`获取命令输出结果。 注意:代码中的用户名、密码和主机名需要替换为实际的值。另外,本示例没有处理命令执行失败等异常情况,实际使用时需要进行异常处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值