我必须安装 CloudLinux,这样才能在一定程度上控制 CPU 使用率,更重要的是控制网站使用的并发连接数。但正如您所见,服务器负载太高,这就是为什么有些网站需要长达 10 秒才能加载!
- 服务器负载 22.46 (8 个 CPU) (!)
- 内存使用量 36.32% (8,146,632 中的 2,959,188) (正常)
- 已使用掉期 0.01% (2,104,504 中的 132) (正常)
服务器:
- 8 个 Intel(R) Xeon(R) CPU E31230 @ 3.20GHz
- 内存:8143680k/9437184k 可用(2621k 内核代码、234872k 保留、1403k 数据、244k 初始化)
- Linux
昨天:总页面浏览量 214,514 (Awstat)
现在我的问题是:我可以将部分 CPU 使用率转移到 RAM 吗?
或者我还能做些什么来让网站运行得更快(网站是动态的 - 因此 SQL 很重)
谢谢
top - 06:10:14 up 29 days, 20:37, 1 user, load average: 11.16, 13.19, 12.81
Tasks: 526 total, 1 running, 524 sleeping, 0 stopped, 1 zombie
Cpu(s): 42.9%us, 21.4%sy, 0.0%ni, 33.7%id, 1.9%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8146632k total, 7427632k used, 719000k free, 131020k buffers
Swap: 2104504k total, 132k used, 2104372k free, 4506644k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
318421 mysql 15 0 1315m 754m 4964 S 474.9 9.5 95300:17 mysqld
6928 root 10 -5 0 0 0 S 2.0 0.0 90:42.85 kondemand/3
476047 headus 17 0 172m 19m 10m S 1.7 0.2 0:00.05 php
476055 headus 18 0 172m 18m 9.9m S 1.7 0.2 0:00.05 php
476056 headus 15 0 172m 19m 10m S 1.7 0.2 0:00.05 php
476061 headus 18 0 172m 19m 10m S 1.7 0.2 0:00.05 php
6930 root 10 -5 0 0 0 S 1.3 0.0 161:48.12 kondemand/5
6931 root 10 -5 0 0 0 S 1.3 0.0 193:11.74 kondemand/6
476049 headus 17 0 172m 19m 10m S 1.3 0.2 0:00.04 php
476050 headus 15 0 172m 18m 9.9m S 1.3 0.2 0:00.04 php
476057 headus 17 0 172m 18m 9.9m S 1.3 0.2 0:00.04 php
6926 root 10 -5 0 0 0 S 1.0 0.0 90:13.88 kondemand/1
6932 root 10 -5 0 0 0 S 1.0 0.0 247:47.50 kondemand/7
476064 worldof 18 0 172m 19m 10m S 1.0 0.2 0:00.03 php
6927 root 10 -5 0 0 0 S 0.7 0.0 93:52.80 kondemand/2
6929 root 10 -5 0 0 0 S 0.3 0.0 161:54.38 kondemand/4
8459 root 15 0 103m 5576 1268 S 0.3 0.1 54:45.39 lvest
答案1
问题显然出在你正在运行的 Web 应用上。从输出来看,top
你似乎正在运行一些 PHP 代码。你需要找出 PHP 代码的哪一部分导致了问题(直接导致或通过数据库访问导致)。
如果示例top
输出描述的是通常的情况,我猜您的进程在应用程序级别互相阻塞(某种锁争用)。
我根据以下事实推断这一点:低 IO 等待时间(输出wa
的数据top
),33% 系统空闲和高负荷。 这意味着你没有运行所有的 CPU,也没有等待 IO。在这种情况下,使系统“太慢”的唯一方法是使进程串行化(一个进程在 CPU#2 上等待,直到另一个进程在 CPU#1 上完成)。只有当不同进程之间存在或多或少显式锁定时,才会发生这种情况。如果您确实无法删除进程间锁定,那么唯一的选择就是投资更快的 CPU 内核,而不是多个慢速内核。您的 CPU 已经非常接近顶级,所以我会考虑先研究代码。
您问是否可以使用一些 RAM 来减少 CPU 使用率。使用积极缓存也许可以,但只有您正在运行的应用程序代码 (PHP) 才能利用这种权衡。同样,您需要分析和修改 PHP 代码。没有神奇的开关说请使用更多内存,更少 CPU。
答案2
我不知道你说的“将 CPU 使用率转移到 RAM”是什么意思,但不管你的意思是什么,它很可能不会起作用。
您需要找出导致应用程序速度变慢的实际瓶颈。这可能包括
- I/O 带宽太低。系统正在等待硬盘
- 数据库性能
- 针对 Web 应用的未优化和/或计算密集型软件。
- 与您的 Web 应用完全无关的其他内容。
答案3
您需要找出造成如此大负载的原因。您的服务器可能被一些 CPU 密集型任务加载,或者出现 IO 拥塞。
如果数据库 IO 负担过重,您可以尝试增加数据库缓存 - mysql 中的 innodb_buffer_pool 或 postgres 中的 shared_buffers。
编辑:
您的top
输出显示您的问题出在未优化的 mysql 查询上。如果您可以管理数据库 - 找出缓慢的请求并创建适当的索引或重写 sql 查询以消除 mysql cpu 瓶颈。如果这不可能 - 购买更强大的 CPU。