Mysql

mysqld 使用過多的 CPU

  • September 11, 2019

我在瀏覽器控制台中執行以下程式碼,以測試我是否容易受到 DoS 攻擊,我意識到mysqld當我執行程式碼時,它使用了大約 90% 的 CPU 和 9.3 的 RAM 大約 5 秒,而伺服器沒有響應直到它完成請求。最初的 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 核心可以處理嗎?歡迎任何幫助。

添加INDEX(slug, type)(以任意順序)。它會比使用“index_merge”更好。

低於long_query_time0.1 或可能為 0。DOS 攻擊(或密碼破解)將是大量快速查詢。然後pt-query-digest用來總結sloglog。

引用自:https://serverfault.com/questions/983869