mysqld 使用过多 CPU

mysqld 使用过多 CPU

我在浏览器控制台中运行了下面的代码,以测试我是否容易受到 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。

相关内容