我在浏览器控制台中运行了下面的代码,以测试我是否容易受到 DoS 攻击,我发现mysqld
当我运行代码时,大约 5 秒钟内使用了约 90% 的 CPU 和 9.3 的 RAM,并且服务器在完成请求之前没有响应。最初,nginx 使用 50% 的 CPU,同样如此mysqld
,2 秒后mysqld
开始使用 90% 的 CPU。
我想知道它是否正常,或者是否有问题,我的意思是,它看起来好像有问题。
var i;
for(i = 0; i < 50; i++){
$.ajax({url:'https://example.com'})
}
top
我运行 js 时命令的结果:
top - 10:05:51 up 3 days, 16:40, 0 users, load average: 0.25, 0.07, 0.02
Tasks: 35 total, 1 running, 34 sleeping, 0 stopped, 0 zombie
%Cpu(s): 94.7 us, 5.0 sy, 0.0 ni, 0.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2097152 total, 635476 free, 640476 used, 821200 buff/cache
KiB Swap: 2097152 total, 2067536 free, 29616 used. 1320984 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10515 mysql 20 0 696732 197796 9132 S 93.0 9.4 4:15.96 mysqld
7339 nobody 20 0 259664 38300 4100 S 1.7 1.8 0:21.65 nginx
15184 myusername 20 0 367452 9232 6052 S 0.7 0.4 0:00.10 php-fpm
15185 myusername 20 0 367452 9244 6052 S 0.7 0.4 0:00.10 php-fpm
15186 myusername 20 0 364188 5676 4004 S 0.7 0.3 0:00.08 php-fpm
15187 myusername 20 0 364188 5676 4004 S 0.7 0.3 0:00.08 php-fpm
15188 myusername 20 0 364188 5676 4004 S 0.7 0.3 0:00.08 php-fpm
15189 myusername 20 0 364188 5680 4008 S 0.7 0.3 0:00.08 php-fpm
402 root 20 0 117760 2464 940 S 0.3 0.1 0:51.09 supervisord
15182 myusername 20 0 367452 9332 6124 S 0.3 0.4 0:00.11 php-fpm
15183 myusername 20 0 364188 5684 4008 S 0.3 0.3 0:00.08 php-fpm
1 root 20 0 178412 3080 2100 S 0.0 0.1 0:14.00 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd/2867
3 root 20 0 0 0 0 S 0.0 0.0 0:00.05 khelper/2867
64 root 20 0 47272 6636 6504 S 0.0 0.3 0:03.09 systemd-journal
66 root 20 0 42768 952 948 S 0.0 0.0 0:00.00 systemd-udevd
我不知道这是否有帮助,但我的php-fpm.conf
在这里:https://pastebin.com/raw/iyNR55Ek
我启用了 slow_query_log(1 秒),没有慢查询。这是执行的查询:
SELECT title, slug FROM table_name WHERE slug = ? AND type = ? LIMIT 1, 30
这是结果EXPLAIN
:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 | SIMPLE | table_name | index_merge | slug,type | slug,type | 63,36 | NULL | 760 | Using intersect(slug,type); Using where
我有两个索引,一个用于列slug
,另一个用于type
。我OPTMIZE
在我的表中使用了它们,但没有变化。
注意:文件中没有任何自定义配置my.cnf
。它是空白的。
这是我的服务器配置:
CPU: 1 core
RAM: 2 GB
SSD: 15GB
Nginx: 1.16
PHP-FPM 7.3.8
Centos 7
也许我的服务器配置较低(相对于我在 js 中发出的请求数量而言)?我在 google pagespeed 上的得分是 97/100,我唯一的问题是 TTFB(约为 750 毫秒)。
如果问题出在我的服务器配置上,那么 2 个 CPU 核心可以解决吗?欢迎任何帮助。
答案1
添加INDEX(slug, type)
(按任意顺序)。这比使用“index_merge”更好。
降低long_query_time
到 0.1 甚至 0。DOS 攻击(或密码破解)将产生大量快速查询。然后用来pt-query-digest
汇总 sloglog。