如果我想避免这种高负载,我该怎么做?
当负载高于 8 时,我的网站就会变慢。
另请查看 iotop 结果。
顶部 - 20:23:10 启动 127 天,3:22,1 个用户,平均负载:9.92、9.87、9.81 任务:总计 1031 个,其中 3 个正在运行,1027 个正在休眠,0 个已停止,1 个僵尸 CPU:14.7%us,0.7%sy,0.1%ni,79.6%id,4.7%wa,0.0%hi,0.2%si,0.0%st 内存:总计 16413676k,已用 16312548k,可用 101128k,缓冲区 110836k 交换:总计 10190840k,已使用 3182468k,可用 7008372k,缓存 2033604k PID 用户 PR NI VIRT RES SHR S %CPU %MEM TIME+ 命令 2776 mysql 15 0 14.6g 10g 5220 S 405.7 67.4 21710:40 mysqld 6201 阿帕奇 15 0 369米 16米 5356 S 3.7 0.1 0:00.40 httpd 8447 阿帕奇 15 0 368米 15米 5364 S 3.7 0.1 0:00.27 httpd 10807 阿帕奇 16 0 368米 14米 4640 S 3.7 0.1 0:00.04 httpd 11074 根 15 0 11548 1668 676 R 3.7 0.0 0:00.04 顶部 2088 阿帕奇 15 0 368米 15米 5972 S 1.8 0.1 0:00.93 httpd 2737 根 15 0 3824 392 336 S 1.8 0.0 433:37.40 klogd 6879 阿帕奇 15 0 367米 15米 5652 S 1.8 0.1 0:00.39 httpd 8457 阿帕奇 15 0 367米 15米 5744 S 1.8 0.1 0:00.54 httpd 8866 阿帕奇 15 0 369米 15米 4832 S 1.8 0.1 0:00.18 httpd 9147 阿帕奇 15 0 368米 14米 4960 S 1.8 0.1 0:00.15 httpd 9884 阿帕奇 16 0 368米 16米 6508 S 1.8 0.1 0:03.97 httpd 10583 阿帕奇 16 0 368米 15米 5148 S 1.8 0.1 0:00.10 httpd 10731 阿帕奇 15 0 367米 13米 3484 S 1.8 0.1 0:00.16 httpd 10782 阿帕奇 16 0 367米 12米 3544 S 1.8 0.1 0:00.04 httpd 14618 阿帕奇 15 0 367米 16米 6736 S 1.8 0.1 0:03.24 httpd 18697 阿帕奇 15 0 368米 16米 6744 S 1.8 0.1 0:02.47 httpd
状态监测 进程 -----------内存---------- ---交换----- -----io---- --系统----- -----cpu------ rb swpd 免费 buff 缓存 si so bi bo in cs us sy id wa st 2 1 3182636 468436 111776 2012016 0 0 94 274 0 0 15 1 80 5 0
iostat Linux 2.6.18-274.12.1.el5()2012 年 12 月 31 日 平均 CPU:%用户%nice%系统%iowait%steal%idle 14.66 0.12 0.93 4.73 0.00 79.56 设备:tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn 平均价格指数 122.97 1504.32 4383.82 16525670026 48158254126 sda1 0.00 0.04 0.00 435456 230 sda2 122.97 1504.28 4383.82 16525231218 48158253896 dm-0 570.94 1502.31 4381.94 16503546226 48137527328 DM-1 0.48 1.97 1.89 21684608 20727136
io 顶部 总磁盘读取速度:126.48 K/s | 总磁盘写入速度:6.79 M/s(这不是太高了吗?) TID PRIO 用户磁盘读取磁盘写入 SWAPIN IO> 命令 15610 be/4 mysql 0.00 B/s 0.00 B/s 99.99 % 25.76 % mysqld --basedi~mysql/mysql.sock 15622 be/4 mysql 0.00 B/s 0.00 B/s -7.28% 24.92% mysqld --basedi~mysql/mysql.sock 3659 be/4 mysql 7.44 K/s 5.88 M/s 0.00 % 13.71 % mysqld --basedi~mysql/mysql.sock 2822 be/4 mysql 0.00 B/s 0.00 B/s 2.88% 10.22% mysqld --basedi~mysql/mysql.sock 2819 be/4 mysql 0.00 B/s 0.00 B/s 0.00 % 9.71 % mysqld --basedi~mysql/mysql.sock 15635 be/4 mysql 0.00 B/s 0.00 B/s -3.72 % 8.09 % mysqld --basedi~mysql/mysql.sock 15629 be/4 mysql 0.00 B/s 0.00 B/s -2.42 % 5.58 % mysqld --basedi~mysql/mysql.sock 801 be/3 根 0.00 B/s 208.31 K/s 0.00 % 3.97 % [kjournald] 2842 be/4 root 0.00 B/s 0.00 B/s 8.09 % 3.81 % irqbalance 2820 be/4 mysql 0.00 B/s 0.00 B/s 0.00 % 2.88 % mysqld --basedi~mysql/mysql.sock 7001 be/4 apache 0.00 B/秒 0.00 B/秒 0.00 % 2.70 % httpd 15636 be/4 mysql 0.00 B/s 0.00 B/s 10.32 % 2.51 % mysqld --basedi~mysql/mysql.sock 8034 be/4 apache 0.00 B/秒 0.00 B/秒 0.00 % 2.42 % httpd 2140 be/4 apache 0.00 B/秒 0.00 B/秒 0.00 % 2.32 % httpd
答案1
你的问题肯定是 I/O 相关的,因为 mySQL 已经将你推入交换空间的深度。理想情况下,你应该使用零大部分时间都是交换,因为操作系统开始将内存交换到磁盘的那一刻,由于进程等待 I/O,性能就会急剧下降。想象一下,Performance = 1 / N ^ swap
随着操作系统使用更多的交换空间,性能通常会得到指数地更糟。你看起来是 3千兆字节深入你的交换空间,这对我来说简直是太可怕了。
如果按照你提到的那样调整了 mySQL 设置后,你的平均值仍然超过几个兆字节你应该考虑以下几点:[从最好到最坏的想法,1 和 2 大致相同]
- 给机器添加更多 RAM。
- 将 mySQL 服务器拆分到另一台专用机器上。这是“添加更多 RAM”的另一种表现形式,但也是分离工作负载的好主意。
- 将交换空间迁移到 SSD 等高速设备。[这将导致 SSD 损坏]
2023年编辑
删除了“优化查询/索引”建议,因为它不太可能产生太大影响。
拥有额外的 RAM(即实际 RAM,而非交换 RAM)的重要性不容小觑。操作系统将使用未分配的内存来缓存文件系统中读取/写入的块。最终,这会导致您经常访问的数据驻留在内存中,并显著降低您的 IO 负载。
对于像数据库工作负载这样的事情,理想的情况是拥有足够的内存来容纳整个数据库,或者尽可能接近您的预算可以管理的内存。
随着可用于缓存的内存减少,IO 负载会上升,并可能严重影响整体性能。一旦您开始让活动内存页面进出交换区,您就会陷入性能地狱的第二深层循环,这是最好的情况。
我可能还应该收回“理想情况下您应该使用零交换”的说法,因为使用“中等”vm.swappiness
设置并让操作系统将陈旧的页面移到交换中可以让您获得相当多的恢复 RAM 来工作。但在这种情况下,10GB 的交换文件实在是太多了。
答案2
如果我想防止这种高负载,我该怎么做?
更快的服务器,更好的编程?
说真的,你从错误的角度看待这个问题。就像“我是一名出租车司机,我每天开车太多公里,我该如何减少行驶里程”。你的请求方是固定的(不考虑 DDoS 攻击等因素),并且必须提供物品。
因此,它归结为 - 获得更强大的服务器,分配更多内存用于缓存(更强大的服务器)或用“修复你的错误”来打击一些程序员,让他们编写更好的代码。
在这种情况下,这可能是 mySql 问题,但随后这个问题会以“使用索引,伙计们”或“编写更好的查询”的形式返回到网站开发人员那里。并不是说我没有看到过这种情况(sql server、门户、零索引、服务器“死机”,IO 吞噬了一切)。但这是网站开发人员必须修补的问题。
答案3
从这里的数据来看,您正在进行交换。这确实会降低您的性能,因为任何类型的交换都会产生这种效果。
我的直接建议是将机器的内存量增加一倍......当然还要增加交换空间以匹配内存大小。
答案4
我认为 Mysql 是你的问题所在。你使用了所有的内存,这导致了交换。交换会导致更高的 CPU 占用,因为你的交换分区已满,而你的 IO 无法处理任何其他事情。如你所见,你的交换正在被使用,但尚未满。虽然更快的磁盘很有趣,但你也应该增加内存。交换仅适用于偶尔使用,而不是持续使用。