我的服务器突然崩溃,每2天左右。 程序员不知道,请帮忙find原因,这里是最高的

每隔几天我的服务器突然崩溃,我必须要求在数据中心重置硬件才能恢复运行。

今天,我回到我的shell,看到服务器已经死了,“上面”正在运行,并在崩溃之前看到下面的“顶部”。

我打开/ var / log / messages并滚动到重启时间,在硬重启之前什么都看不到,没有错误。 (我检查了/etc/syslog.conf,看到“* .info; mail.none; authpriv.none; cron.none / var / log / messages”,是不是足以logging所有问题?)

通常当我看到顶部时,交换不会像这样用完! 我也不知道为什么mysqld是在323%的CPU(服务器只运行Drupal,它从不缓慢或超载)。 求解器是我的应用程序。 我不知道“sh”和“dovecot”在做什么。

它在上个月使我疯狂,请帮我解决这个谜,停止我的停工。

top - 01:10:06 up 6 days, 5 min, 3 users, load average: 34.87, 18.68, 9.03 Tasks: 500 total, 19 running, 481 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 96.6%sy, 0.0%ni, 1.7%id, 1.8%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 8165600k total, 8139764k used, 25836k free, 428k buffers Swap: 2104496k total, 2104496k used, 0k free, 8236k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4421 mysql 15 0 571m 105m 976 S 323.5 1.3 9:08.00 mysqld 564 root 20 -5 0 0 0 R 99.5 0.0 2:49.16 kswapd1 25767 apache 19 0 399m 8060 888 D 79.3 0.1 0:06.64 httpd 25781 apache 19 0 398m 5648 492 R 79.0 0.1 0:08.21 httpd 25961 apache 25 0 398m 5700 560 R 76.7 0.1 0:17.81 httpd 25980 apache 25 0 10816 668 520 R 75.0 0.0 0:46.95 sh 563 root 20 -5 0 0 0 D 71.4 0.0 3:12.37 kswapd0 25766 apache 25 0 399m 7256 756 R 69.7 0.1 0:39.83 httpd 25911 apache 25 0 398m 5612 480 R 58.8 0.1 0:17.63 httpd 25782 apache 25 0 440m 38m 648 R 55.2 0.5 0:18.94 httpd 25966 apache 25 0 398m 5640 556 R 55.2 0.1 0:48.84 httpd 4588 root 25 0 74860 596 476 R 53.9 0.0 0:37.90 crond 25939 apache 25 0 2776 172 84 R 48.9 0.0 0:59.46 solver 4575 root 25 0 397m 6004 1144 R 48.6 0.1 1:00.43 httpd 25962 apache 25 0 398m 5628 492 R 47.9 0.1 0:14.58 httpd 25824 apache 25 0 440m 39m 680 D 47.3 0.5 0:57.85 httpd 25968 apache 25 0 398m 5612 528 R 46.6 0.1 0:42.73 httpd 4477 root 25 0 6084 396 280 R 46.3 0.0 0:59.53 dovecot 25982 root 25 0 397m 5108 240 R 45.9 0.1 0:18.01 httpd 25943 apache 25 0 2916 172 8 R 44.0 0.0 0:53.54 solver 30687 apache 25 0 468m 63m 1124 D 42.3 0.8 0:45.02 httpd 25978 apache 25 0 398m 5688 600 R 23.8 0.1 0:40.99 httpd 25983 root 25 0 397m 5272 384 D 14.9 0.1 0:18.99 httpd 935 root 10 -5 0 0 0 D 14.2 0.0 1:54.60 kjournald 25986 root 25 0 397m 5308 420 D 8.9 0.1 0:04.75 httpd 4011 haldaemo 25 0 31568 1476 716 S 5.6 0.0 0:24.36 hald 25956 apache 23 0 398m 5872 644 S 5.6 0.1 0:13.85 httpd 18336 root 18 0 13004 1332 724 R 0.3 0.0 1:46.66 top 1 root 18 0 10372 212 180 S 0.0 0.0 0:05.99 init 2 root RT -5 0 0 0 S 0.0 0.0 0:00.95 migration/0 3 root 34 19 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/0 4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0 5 root RT -5 0 0 0 S 0.0 0.0 0:00.15 migration/1 6 root 34 19 0 0 0 S 0.0 0.0 0:00 

.06 ksoftirqd / 1

这里是一个正常的顶部,当服务器工作正常:

 top - 01:50:41 up 21 min, 1 user, load average: 2.98, 2.70, 1.68 Tasks: 271 total, 2 running, 269 sleeping, 0 stopped, 0 zombie Cpu(s): 15.0%us, 1.1%sy, 0.0%ni, 81.4%id, 2.4%wa, 0.1%hi, 0.0%si, 0.0%st Mem: 8165600k total, 2035856k used, 6129744k free, 60840k buffers Swap: 2104496k total, 0k used, 2104496k free, 283744k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2204 apache 17 0 466m 83m 19m S 25.9 1.0 0:22.16 httpd 11347 apache 15 0 466m 83m 19m S 25.9 1.0 0:26.10 httpd 18204 apache 18 0 481m 97m 19m D 25.2 1.2 0:13.99 httpd 4644 apache 18 0 481m 100m 19m D 24.6 1.3 1:17.12 httpd 4727 apache 17 0 481m 99m 19m S 24.3 1.2 1:10.77 httpd 4777 apache 17 0 482m 102m 21m S 23.6 1.3 1:38.27 httpd 8924 apache 15 0 483m 99m 19m S 22.3 1.3 1:13.41 httpd 9390 apache 18 0 483m 99m 19m S 18.9 1.2 1:05.35 httpd 4728 apache 16 0 481m 101m 19m S 14.3 1.3 1:12.50 httpd 4648 apache 15 0 481m 107m 27m S 12.6 1.4 1:18.62 httpd 24955 apache 15 0 467m 82m 19m S 3.3 1.0 0:21.80 httpd 4722 apache 15 0 503m 118m 19m R 1.7 1.5 1:17.79 httpd 4647 apache 15 0 484m 105m 20m S 1.3 1.3 1:40.73 httpd 4643 apache 16 0 481m 100m 20m S 0.7 1.3 1:11.80 httpd 1561 root 15 0 12900 1264 828 R 0.3 0.0 0:00.54 top 4434 mysql 15 0 496m 55m 4812 S 0.3 0.7 0:06.69 mysqld 4646 apache 15 0 481m 100m 19m S 0.3 1.3 1:25.51 httpd 1 root 18 0 10372 692 580 S 0.0 0.0 0:02.09 init 2 root RT -5 0 0 0 S 0.0 0.0 0:00.03 migration/0 3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0 4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0 5 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/1 6 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1 7 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/1 8 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/2 9 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/2 10 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/2 11 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/3 12 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/3 13 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/3 14 root RT -5 0 0 0 S 0.0 0.0 0:00.03 migration/4 15 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/4 16 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/4 17 root RT -5 0 0 0 S 0.0 0.0 0:00.02 migration/5 18 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/5 19 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/5 20 root RT -5 0 0 0 S 0.0 0.0 0:00.01 migration/6 21 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/6 22 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/6 23 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/7 

我的猜测是,当数据库locking时,因为等待Web请求,你的系统正在交换自己的死亡。 您可能有一个或两个偶尔运行的查询(可能来自cronjob),这会导致经常用于locking的数据库表之一。 一旦完成,所有查询都会开始备份,直到系统开始交换。 一旦开始发生,就结束了。

检查您的慢日志,并检查定期查询运行几个小时内通常发生崩溃。

看看你的Apacheconfiguration。

你想限制你的apache进程的最大数量到一个适合内存的数字而不需要交换

如果你开始交换(你有),你的Apache将会像一个完全的狗一样运行。 在这一点上,任何新的连接都将导致Apache产生更多的孩子(因为你现在的孩子都很忙)。

如果适合内存的apache进程数量不足以满足您的请求,则需要更多内存或优化应用程序。 首先要看的是你的mysql查询。 检查索引。 任何缓慢的查询都将成为所有apache进程同步的瓶颈 – 也就是说,如果最慢的查询需要1秒钟,而且只有5个可以放入内存的apache进程,那么您将无法处理每秒查询5次以上。

麦克风。

顶部的输出表明您的内存不足。 您发布的顶级( CPU )用户中没有任何东西是罪魁祸首。 尽pipe你可以在内存sorting模式(按大写M顶部切换)离开顶部运行,但是将数据收集到磁盘供以后分析要好得多。 虽然sar通常是有用的,但对每个进程的东西没有好处; 为此,您需要pidstat (与Debian中的sarsysstat包相同)。 不幸的是, pidstat缺乏sar的批量数据收集的一些细节,但是将一些东西拼凑起来并不难,以便将必要的数据存入磁盘供以后阅读。

你的平均使用量是平常的。 1.68? 对于交互式服务器来说这不是一个好的数字。

你从271进程到500进程。 上面没有任何内容显示内存在哪里,但是我怀疑你有很多进程只占总内存的百分之几。 例如,Apache进程。

看起来有些东西正在造成CPU瓶颈,导致请求堆积,直到RAM用完。 这可能是一个cron的工作,也可能是应用程序本身是CPU饿了。

我会打赌在正常使用情况下的平均负载是1.68,MySQL的负载很高,这是一个次优的查询。

如果应用程序可以限制同时使用的用户数量,那么可能是暂时处理这种情况的一种蹩脚(但有效)的方式。 用sar开始logging并打开慢查询日志。

所有这一切说…这是系统pipe理员得到支付修复。 这可能不像看顶部输出和处方解决scheme那么简单。 为了让开发人员解决这个问题,花费在系统pipe理员身上的钱可能会更好,以便仔细查看系统性能。

(dovecot是一个imap / pop3服务器,apache上的sh是可疑的,但你的开发者可以看看)。

使用mytop或任何其他实用程序,它会告诉你在MySQL中的当前运行的查询列表,比试图找出你在哪里使用比。 看起来像MySQL运行沉重,服务器开始交换数据,在同一时间apache处理新旧查询,并开始交换

顶上是你所需要的。 http://www.atoptool.nl/ 。 可在任何地方销售精美的分销。 ;)

确保在init / systemd引导级别启用包含的守护进程。 那么,你可以使用

 atop -r /var/log/atop/<rawfile> 

以“t”和“T”查看一个可以回退和FORTH TIME的超级顶层接口,并为所有运行相同名称的程序(又名'apache'或'httpd')聚合资源。 非常有用,看看吃什么你的RAM和SWAP杀死你的盒子。 其他许多事情。

真正的顶峰是“更好的顶峰”。 我不知道为什么更多的人不使用它。

我同意麦克,你的web服务器configuration目前正在接受比它有能力处理更多的连接。 限制请求的数量是解决scheme的一部分,以保护您的系统,但要保持您的服务的可用性,您需要调查stream量累积的原因(大量的日志分析),并减less居民请求的数量。 后者是通过调整Keepalive,caching和数据库优化来完成的 – 更多的日志分析。 还有很多检查你应该对你的操作系统运行 – 确保你使用正确的挂载选项,Io调度程序,IRQ平衡等

检查mysql是否未configuration为使用mysqltuner .pl使用过量的内存,并且内存过量使用被禁用。

最终增加更多的硬件容量可能是必要的,但是从这个开始往往更便宜,而不是花费时间和金钱来确定和解决问题,特别是如果你的操作规模很小。