我有一个虚拟机,有64个vCPU和256GB内存,最近我决定对这个虚拟机上运行的网站进行一些压力测试,整个VM只针对这个网站。
我运行的第一个测试是每秒20,000个用户,平均响应时间约为1400毫秒,在测试期间,网站无法使用。
在那之后,我决定检查顶级进程以确定问题的根源。以下是测试期间的进程及其CPU利用率:
top - 10:30:19 up 1 day, 34 min, 0 users, load average: 8.39, 3.04, 1.46
Tasks: 711 total, 2 running, 709 sleeping, 0 stopped, 0 zombie
%Cpu(s): 6.0 us, 9.8 sy, 3.8 ni, 79.2 id, 0.2 wa, 0.0 hi, 0.9 si, 0.0 st
MiB Mem : 257925.6 total, 219425.1 free, 3658.2 used, 34842.3 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 252346.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
218159 mysql 20 0 6911232 96204 19792 S 491.4 0.0 4:24.99 mysqld
139405 nobody 20 0 54948 34196 6128 D 44.9 0.0 0:52.17 litespeed
218251 obl74+ 21 1 347708 29228 19328 S 40.9 0.0 0:20.83 lsphp
218402 obl74+ 21 1 347708 29152 19264 S 40.9 0.0 0:22.35 lsphp
218955 obl74+ 21 1 273004 21336 12472 D 40.9 0.0 0:22.39 lsphp
218957 obl74+ 21 1 273004 21336 12472 D 40.9 0.0 0:22.22 lsphp
218961 obl74+ 21 1 273004 21336 12472 S 40.9 0.0 0:22.37 lsphp
218963 obl74+ 21 1 273004 21328 12468 S 40.9 0.0 0:22.31 lsphp
218252 obl74+ 21 1 347708 29228 19328 D 40.5 0.0 0:22.42 lsphp
218407 obl74+ 21 1 347708 29152 19264 D 40.5 0.0 0:22.30 lsphp
218956 obl74+ 21 1 273004 21332 12472 S 40.5 0.0 0:20.73 lsphp
218959 obl74+ 21 1 273004 21336 12472 S 40.5 0.0 0:22.13 lsphp
有趣的是,尽管网站在测试中表现不佳,但CPU和内存使用率都不是特别高。此外,在测试中,CyberPanel显示CPU使用率为19%,内存使用率为2%。因此,我得出结论,服务器没有遇到任何资源限制,因为它没有利用所有的CPU和内存。但由于某种原因,它仍然滞后。
然后,我决定从执行压力测试的页面中删除与MySQL相关的组件,结果要稳定得多。
top - 10:43:54 up 1 day, 47 min, 0 users, load average: 0.87, 1.23, 1.41
Tasks: 705 total, 5 running, 699 sleeping, 0 stopped, 1 zombie
%Cpu(s): 2.8 us, 1.0 sy, 0.4 ni, 95.2 id, 0.0 wa, 0.0 hi, 0.5 si, 0.0 st
MiB Mem : 257925.6 total, 218249.7 free, 3910.0 used, 35765.9 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 252098.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
139416 nobody 20 0 53200 32480 6128 S 18.3 0.0 0:47.00 litespeed
139402 nobody 20 0 52928 33308 7204 S 16.6 0.0 0:44.40 litespeed
139409 nobody 20 0 54900 34136 6188 S 16.6 0.0 0:46.38 litespeed
139410 nobody 20 0 49904 29156 6128 S 16.6 0.0 0:35.43 litespeed
139414 nobody 20 0 51688 30936 6128 R 16.6 0.0 0:45.46 litespeed
139415 nobody 20 0 55492 35280 6680 R 15.9 0.0 0:46.24 litespeed
139412 nobody 20 0 52112 31420 6188 S 15.6 0.0 0:45.05 litespeed
139404 nobody 20 0 50396 29644 6128 S 15.3 0.0 0:44.83 litespeed
139413 nobody 20 0 44700 23816 6128 S 15.3 0.0 0:21.83 litespeed
139406 nobody 20 0 50752 30004 6128 S 15.0 0.0 1:05.25 litespeed
根据CyberPanel,在新测试期间,CPU使用率为4%,内存使用率为2%。
因此,很明显MySQL有问题。我目前使用CyberPanel提供的默认my. cnf配置,但我尝试了互联网上找到的各种其他配置,但没有任何改善性能,甚至一点点。我也尝试了MySQL Tuner之类的东西,但它没有改变性能。
我在第二个测试中删除的MySQL部分是一个包含7行的表的基本查询,它验证用户的IP地址以确定他们是否在IP白名单上,这个操作应该不会造成严重的问题。
正如在两个测试中所观察到的,我在开始时检测到一个阈值或瓶颈,超过这个阈值,站点的延迟会急剧增加。尽管有足够的可用内存和CPU,但似乎存在一些限制因素。
有些人可能会说每秒20,000个用户的速度太高了,而且不现实,但是,即使我在每秒只有250个用户的情况下进行测试,结果也是一样的:网站运行速度非常慢,无法使用。
在这一点上,我完全迷失了方向。我不知道我的努力集中在哪里,以及下一步采取什么步骤来减少平均响应时间。我将非常感谢您可能有任何有见地的评论或建议,我提前感谢您的时间和考虑。
- 更新 *
我已经重新安装了操作系统和CyberPanel,看起来问题已经解决了。虽然我不确定之前出了什么问题,但我怀疑是不正确的设置造成的。
2条答案
按热度按时间vtwuwzda1#
CloudSQL配置要考虑的建议
请查看个人资料以获取联系信息。其他性能增强可用。
eqqqjvef2#
对于每秒2万个用户,您需要多台服务器和交换机在他们前面。句号。讨论结束。
好吧,好吧,我会进一步讨论的。
当MySQL面对大量“并发”用户时,它会公平地对待他们--每个用户都被赋予对所有资源的平等访问权。这在它福尔斯下悬崖之前是很好的。这是当大多数处理都在处理资源共享时。所有线程最终都会完成,但每个线程都将花费很长时间,而你(DBA)会认为它崩溃了,并拔掉插头。
一个简单的解决方法是 * 降低 *(是的,降低)
max_connections
的值。结果发现,“悬崖”在几十个连接处。在基准测试中,一个人向服务器扔尽可能多的东西,直到服务器崩溃。通常是几十个。
在真实的生活中,网页并不是100%地进行数据库操作,而是让用户做出React,构建页面等。因此,几百个
max_connections
是现实的。一旦到达悬崖,latency 就会突破屋顶。你可能会期望 throughput 也会增加,但它会略有下降。我相信这是因为线程之间的冲突太多了。想想任何“cache”(buffer_pool、open_tables、table_definitions等)--如果“太多”线程在运行,缓存可能会变得无效。
想象一个购物者众多的市场,他们大部分时间都在和其他人周旋,如果他们能阻止购物者在“满座”时进入市场,那么每小时就能有更多的购物者通过市场。
需要索引
(Then参加一个关于索引(又名“KEY”)好处的速成班。)