mysql与apache消耗大量CPU的问题解决办法

重启服务器后,使用 top 命令看看是哪些进程消耗那么大的 CPU 使用。盯了有好十几分钟,主要消耗 CPU 的进程有两个,一个是 mysql,另一个是 apache。下面的图可以看到,mysql 占用了很大部分的 CPU 使用。apache 单个进程虽然占得不多,但有不少个 apache 进程同时存在,也消耗了不少 CPU 的使用。

当然,这些不足以让服务器的 CPU 直接跑满挂掉,后来发现了两个大家伙:

当 mysql 的 CPU 消耗降下来之后,出现了两个奇怪的进程:kswapd0 和 events/0。

1. kswapd0

 代码如下 复制代码

Linux uses kswapd for virtual memory management such that pages that have been recently accessed are kept in memory and less active pages are paged out to disk.

(what is a page?)…Linux uses manages memory in units called pages.

So,the kswapd process regularly decreases the ages of unreferenced pages…and at the end they are paged out(moved out) to disk

kswapd0进程的作用:它是虚拟内存管理中,负责换页的,操作系统每过一定时间就会唤醒kswapd ,看看内存是否紧张,如果不紧张,则睡眠,在 kswapd 中,有2 个阀值,pages_hige 和 pages_low,当空闲内存页的数量低于 pages_low 的时候,kswapd进程就会扫描内存并且每次释放出32 个free pages,直到 free page 的数量到达pages_high。

查看内存使用率,发现内存确实不够用,有时候已经使用到了swap。

2. events/0

另一个进程 events/0 是工作者线程,主要是用来执行delay work的。先简单介绍一下。

我们都知道中断的底半部机制有三种:软中断、tasklet和工作队列。其中软中断很少使用,内核中只有网络在使用,它的延时是最小的。

tasklet是软中断的一个应用,所有线程注册的tasklet都会顺序被执行。因此tasklet的执行环境是软中断上下文,所以不能阻塞或者睡眠。一般情况下,tasklet的延迟也很小,可以满足大部分需求。

要是底半部中可能睡眠,那么只好使用工作队列了。工作队列其实是把要做的底半部的函数交给内核的专门线程去调用。这样工作队列就运行于线程环境了,不怕睡眠。当然,睡眠会影响注册到同一线程的其它底半部的执行,但不会引起大的问题。每个CPU都有一个线程(events/n,n是编号)负责执行工作队列,第一个CPU的线程是events/0,如果是双核的,还会有一个events/1线程。程序使用了工作队列,所以每次执行都会多出一个events/0(第一个CPU上工作线程)。

内核的软中断辅助处理线程ksoftirqd/n(n是CPU编号),它们负责出发软中断中触发的软中断。它们将重新触发软中断放在系统空闲时调用,而不是马上。这样用户空间不至于饥饿,重新触发的软中断也得以尽快执行。(《Linux内核设计与实现》85页)

宕机原因显而易见了,physical mem 不足,引起 swap 频繁。其实这也是 VPS 使用上的一个常见的问题了,通常是由 Apache 占用内存过多引起的。kswapd0 是系统的虚拟内存管理程序,如果物理内存不够用,系统就会唤醒 kswapd0 进程,由 kswapd0 分配磁盘交换空间作缓存,因而占用大量的 CPU 资源。重启Apache,释放内存,问题就会消失。但这不是长久之计,最好的方法还是花点钱升级下内存。我也知道随着访问量的不断上涨,肯定要升级下内存,但是没想到这个问题这么快就来了……

时间: 2024-09-19 08:14:40

mysql与apache消耗大量CPU的问题解决办法的相关文章

MySQL sleep进程连接过多卡住了问题解决办法

MySQL sleep进程连接过多原因分析 当php的页面执行结束时,会自动释放掉一切.相信很多人都跟我想的一样.但事实证明并不是这样.比如session就不会随着页面执行完毕而释放. php的垃圾回收机制,其实只针对于php本身.对于mysql,php没权利去自动去释放它的东西.如果你在页面执行完毕前不调用mysql_close(),那么mysql那边是不会关闭这个连接的.如果你是用的是pconnect方式,即使你在页面执行完毕前调用mysql_close(),也无法另mysql关闭这个连接

mysql字符集导致恢复数据库报错问题解决办法

恢复数据库报错:由于字符集问题,最原始的数据库默认编码是latin1,新备份的数据库的编码是utf8,因此导致恢复错误. [root@hk byrd]# /usr/local/mysql/bin/mysql -uroot -p'admin' t4x < /tmp/11x-B-2014-06-18.sql ERROR 1064 (42000) at line 292: You have an error in your SQL syntax; check the manual that corre

PHP-FPM进程CPU 100% 问题解决办法

一.进程跟踪  代码如下 复制代码 # top //找出CPU使用率高的进程PID # strace -p PID //跟踪进程 # ll /proc/PID/fd //查看该进程在处理哪些文件 将有可疑的PHP代码修改之,如:file_get_contents没有设置超时时间. 二.内存分配 如果进程跟踪无法找到问题所在,再从系统方面找原因,会不会有可能内存不够用?据说一个较为干净的PHP-CGI打开大概20M-30M左右的内存,决定于PHP模块开启多少. 通过pmap指令查看PHP-CGI进

mysql导入数据提示 USING BTREE错误问题解决办法

最近使用mysql导入sql脚本时间出现错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 查找 USING BTREE mysql,你会看到很多这样的例子,mysql 5.

mysql中CONCAT值为空的问题解决办法

天在做opencart开发的时候,需要对用户表中用户的电话号码和区号连接起来,于是使用了concat方法,  代码如下 复制代码 SELECT CONCAT(isdcode,telephone) FROM gb_customer 竟然发现很多NULL列,telephone明明是有值的,于是查询了相关concat方法, 解释如下  代码如下 复制代码 mysql CONCAT(str1,str2,-)   返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL.或许有一

暴风影音在播放高清视频时占用的CPU高问题解决办法

请您在高清加速设置中使用"对以下视频开启",并根据您的需要选择720P或者1080P. 如果按我们上面的方法还是无法解决CPU占得高的问题我们可以尝试切换版非高清版本哦,有可能是你显卡不行导致界面卡了.

《PHP、MySQL和Apache入门经典(第5版)》一2.8 MySQL权限系统简介

2.8 MySQL权限系统简介 PHP.MySQL和Apache入门经典(第5版) MySQL权限系统总是起作用的.当你第一次尝试连接MySQL服务器的时候,并且对于每一个后续的动作,MySQL都会检查以下3件事情. 你从哪里访问(你的主机)? 你说你是谁(你的用户名和密码)? 允许你做什么(你的命令权限)? 所有这些信息都存储在一个名为mysql的数据库中,当安装MySQL的时候,自动创建该数据库.在mysql数据库中,有如下几个和权限相关的表. columns_priv--为一个表中的具体字

《PHP、MySQL和Apache入门经典(第5版)》一导读

前 言 PHP.MySQL和Apache入门经典(第5版) 欢迎阅读本书.我很高兴地告诉你,PHP语言及其开发者社群和用户每天都在持续增加,因此,本书需要更新版本. 本书前一个版本介绍的PHP4,其"生命尽头"终于快到了,在GoPHP5活动的帮助下,Web主机服务提供商和应用程序开发者迁移其服务和代码,逐渐放弃特定于PHP 4的功能和代码实践,而进入PHP 5的世界.这是一个更快速.更好的功能集合.和本书上一版一样,本版中所有的代码都是基于编写本书的时候PHP最新的可用版本(具体来说就

《PHP、MySQL和Apache入门经典(第5版)》一2.5 在Windows上安装MySQL

2.5 在Windows上安装MySQL PHP.MySQL和Apache入门经典(第5版) Windows上的MySQL安装过程使用一个标准的Microsoft Windows安装程序(Microsoft Windows Installer,MSI)文件来完成在Windows XP. Windows Server 2003.Windows Vista或Windows 7机器上MySQL的安装和配置过程.到位于http://dev.mysql.com/downloads/mysql/5.0.ht