linux的mysql占用cpu过高_关于在Linux环境下,Mysql占用CPU使用率100%的优化

今天使用 MobaXterml 连接上一台物联网的Linux服务器的使用,发现该服务器的CPU使用率一直在100%左右。

ca0c9145e46c8f92354c7cec35a0e53f.png

使用top 命令发现Mysql占用了大量的CPU

675e732429401e80e487c171066330d5.png

用数据库工具 Navicat premium 以 root 的身份连接数据库,执行查询语句:

show PROCESSLIST;

发现主要是这条查询语句导致Mysql占用CPU的资源:

0f3eda7fb019c46f7a233a9d03431a56.png

于是采取以下步骤进行优化:

1.使用字段`contect_id`, `come_from`建立组合索引;

2.暂停物联网服务,使用查询语句:TRUNCATE  Table c_clients ,重置了这张表。(这个命名不要随便执行,会删除所有数据,并重置表,ID会从1重新开始,我这张表只保存当前在线的客户端数据,所以无所谓)。

这使用重新查看CPU占用情况,发现已经下降到了60%左右的占用率。

4b43b4d89b78d680aa0feec22fb16399.png

继续深入优化:

1.使用查询语句:show variables like 'slow_query%',查看Mysql是否开启了慢日志,以及慢日志的存储位置;

1c1c7b0fccc1d922023ad8ad7dcb5050.png

2.得到慢日志存储位置后,在 中使用Linux命令: cat -n  /usr/local/mysql/data/slow_1.log | tail -n 100,查看慢日志的最后100行记录(由于日志太大,最好不要一次性全部打开,否有有可能占满CPU和内存导致服务器死机)

d59537b4ed37b8443d37ad6507aab571.png

利用Mysql慢日志分析,如果是select语句比较慢,那需要针对性的建立索引。如果是insert慢,可以适当的删除索引。如果是update慢,可以根据实际情况,删除或添加索引。

最后优化完,CPU回归了平静。

db092bdf87945df16424615a1a416283.png

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要获取Ubuntu系统指定进程的资源占用情况,可以使用Java的ProcessBuilder类和Linux命令行工具top。具体步骤如下: 1. 使用ProcessBuilder类启动top命令,并将输出流重定向到Java程序。 ```java ProcessBuilder pb = new ProcessBuilder("top", "-b", "-n", "1", "-p", "pid"); pb.redirectErrorStream(true); Process process = pb.start(); ``` 其,pid是指定进程的进程号。 2. 读取top命令的输出,解析出需要的资源占用情况。 ```java BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { if (line.startsWith(pid)) { String[] tokens = line.trim().replaceAll("\\s+", " ").split(" "); double cpuUsage = Double.parseDouble(tokens[8]); double memUsage = Double.parseDouble(tokens[9]); // do something with cpuUsage and memUsage } } ``` 在解析top命令的输出时,我们只需要找到指定进程的行,然后提取出CPU使用率和内存使用率即可。 3. 将资源占用情况保存到MySQL数据库。 ```java Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password"); PreparedStatement stmt = conn.prepareStatement("INSERT INTO process_usage(pid, cpu_usage, mem_usage) VALUES (?, ?, ?)"); stmt.setInt(1, pid); stmt.setDouble(2, cpuUsage); stmt.setDouble(3, memUsage); stmt.executeUpdate(); ``` 在保存资源占用情况时,我们可以将进程号、CPU使用率和内存使用率保存到MySQL数据库的一个表。需要注意的是,需要提前创建好表和相关的数据库连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值