溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何把mysqld壓測(cè)到崩潰重啟

發(fā)布時(shí)間:2021-10-26 17:14:52 來(lái)源:億速云 閱讀:191 作者:小新 欄目:MySQL數(shù)據(jù)庫(kù)

小編給大家分享一下如何把mysqld壓測(cè)到崩潰重啟,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

一、壓測(cè)環(huán)境工具準(zhǔn)備:

centos7.5   

sysbench2.0.9

mysql5.7.22

機(jī)器配置:宿主機(jī)是vmware esxi

DELL R730 

硬盤:普通10K SAS

內(nèi)存:18G

CPU:8核

非常普通的cpu:

[root@yw-gz-hd-test-211 log]# lscpu 
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             8
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 79
Model name:            Intel(R) Xeon(R) CPU E5-2640 v4 @ 2.40GHz
Stepping:              1
CPU MHz:               2399.361
BogoMIPS:              4799.99
Hypervisor vendor:     VMware
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              25600K
NUMA node0 CPU(s):     0-7
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 invpcid rtm rdseed adx smap xsaveopt arat

 編譯安裝好mysql,設(shè)置   innodb_buffer_pool_size=5G innodb_buffer_pool_instance=5. 其他參數(shù)更改redo 為4組,io thread 為8 等等一些參數(shù)。                      

二、開始準(zhǔn)備壓測(cè)數(shù)據(jù)庫(kù):

插入10張表,每個(gè)表數(shù)據(jù)1000萬(wàn),整個(gè)msyql庫(kù)25G。

[root@yw-gz-hd-test-211 ~]# ls /data/mysql3308/sbtest/ -lh
total 25G
-rw-r----- 1 mysql mysql   61 Jul 17 19:24 db.opt
-rw-r----- 1 mysql mysql 8.5K Jul 17 19:32 sbtest10.frm
-rw-r----- 1 mysql mysql 2.5G Jul 18 14:58 sbtest10.ibd
-rw-r----- 1 mysql mysql 8.5K Jul 17 19:32 sbtest1.frm
-rw-r----- 1 mysql mysql 2.5G Jul 18 14:58 sbtest1.ibd
-rw-r----- 1 mysql mysql 8.5K Jul 17 19:32 sbtest2.frm
-rw-r----- 1 mysql mysql 2.5G Jul 18 14:58 sbtest2.ibd
-rw-r----- 1 mysql mysql 8.5K Jul 17 19:32 sbtest3.frm
-rw-r----- 1 mysql mysql 2.5G Jul 18 14:58 sbtest3.ibd
-rw-r----- 1 mysql mysql 8.5K Jul 17 19:32 sbtest4.frm
-rw-r----- 1 mysql mysql 2.5G Jul 18 14:58 sbtest4.ibd
-rw-r----- 1 mysql mysql 8.5K Jul 17 19:32 sbtest5.frm
-rw-r----- 1 mysql mysql 2.5G Jul 18 14:58 sbtest5.ibd
-rw-r----- 1 mysql mysql 8.5K Jul 17 19:32 sbtest6.frm
-rw-r----- 1 mysql mysql 2.5G Jul 18 14:58 sbtest6.ibd
-rw-r----- 1 mysql mysql 8.5K Jul 17 19:32 sbtest7.frm
-rw-r----- 1 mysql mysql 2.5G Jul 18 14:58 sbtest7.ibd
-rw-r----- 1 mysql mysql 8.5K Jul 17 19:32 sbtest8.frm
-rw-r----- 1 mysql mysql 2.5G Jul 18 14:58 sbtest8.ibd
-rw-r----- 1 mysql mysql 8.5K Jul 17 19:32 sbtest9.frm
-rw-r----- 1 mysql mysql 2.5G Jul 18 14:58 sbtest9.ibd
[root@yw-gz-hd-test-211 ~]# ls /data/mysql3308/ -lh
total 1.4G
-rw-r----- 1 mysql mysql   56 Jul 17 17:56 auto.cnf
-rw-r----- 1 mysql mysql 1.5K Jul 18 14:17 ib_buffer_pool
-rw-r----- 1 mysql mysql 384M Jul 18 15:13 ibdata1
-rw-r----- 1 mysql mysql 256M Jul 18 15:13 ib_logfile0
-rw-r----- 1 mysql mysql 256M Jul 18 14:50 ib_logfile1
-rw-r----- 1 mysql mysql 256M Jul 18 15:13 ib_logfile2
-rw-r----- 1 mysql mysql 256M Jul 18 14:49 ib_logfile3
-rw-r----- 1 mysql mysql  12M Jul 18 15:21 ibtmp1
drwxr-x--- 2 mysql mysql 4.0K Jul 17 17:56 mysql
srwxrwxrwx 1 mysql mysql    0 Jul 18 14:42 mysql.sock
-rw------- 1 mysql mysql    6 Jul 18 14:42 mysql.sock.lock
drwxr-x--- 2 mysql mysql 8.0K Jul 17 17:56 performance_schema
drwxr-x--- 2 mysql mysql 4.0K Jul 17 19:36 sbtest
drwxr-x--- 2 mysql mysql 8.0K Jul 17 17:56 sys
-rw-r----- 1 mysql mysql    6 Jul 18 14:42 yw-gz-hd-test-211.pid

三、開始?jí)簻y(cè):

首先300個(gè)線程,開始上。你會(huì)發(fā)現(xiàn),立馬報(bào)錯(cuò):

FATAL: mysql_stmt_prepare() failed
FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 100000)"

百度一下,設(shè)置一下參數(shù)可以解決:max_prepared_stmt_count=150000

四、高潮出現(xiàn):

錯(cuò)誤排除,壓測(cè)到線程300個(gè),總共時(shí)長(zhǎng)是240秒,等到壓測(cè)到120秒的時(shí)候,mysql進(jìn)程突然奔潰。錯(cuò)誤日志中沒有記錄mysql奔潰的原因,只記錄到mysql崩潰后,被mysqld_safe 進(jìn)程監(jiān)控,然后立即拉起mysqld 進(jìn)程。mysqld_safe 進(jìn)程會(huì)一直監(jiān)控mysqld進(jìn)程,發(fā)現(xiàn)死掉,立即拉起mysqld進(jìn)程。我懷疑是內(nèi)存不夠。但是沒有證據(jù)證明:是內(nèi)存不夠?qū)е碌膍ysqld進(jìn)程奔潰。這個(gè)時(shí)候,我發(fā)現(xiàn)top命令還是很好用的。怎么用呢?讓我娓娓道來(lái)。前面不是講到了,壓測(cè)剛開始的120秒,沒有問題,你可以在這個(gè)壓測(cè)0~120秒的時(shí)候,打開top,你觀察mysqld線程使用內(nèi)存情況。你觀察RES這一列,你會(huì)發(fā)現(xiàn),mysqld進(jìn)程RES值,從500M一直增長(zhǎng),增長(zhǎng)到5G的時(shí)候,duang~,崩潰了。看出來(lái)了吧,mysql也有承受不住的時(shí)候。

        為了驗(yàn)證自己是猜想,很簡(jiǎn)單,不要更改任何參數(shù),增加機(jī)器內(nèi)存到18G。再一次壓測(cè),驗(yàn)證了我的想法,mysqld進(jìn)程再300個(gè)并發(fā)線程中使用掉了6G內(nèi)存。

來(lái)看下300個(gè)并發(fā)壓測(cè)情況

[root@yw-gz-hd-test-211 ~]# sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host=localhost --mysql-socket=/data/mysql3308/mysql.sock  --mysql-port=3308  --mysql-db=sbtest --mysql-user=root --mysql-password=123456 --table_size=10000000 --tables=10 --threads=300  --time=240 --report-interval=30 run
sysbench 1.0.9 (using system LuaJIT 2.0.4)
Running the test with following options:
Number of threads: 300
Report intermediate results every 30 second(s)
Initializing random number generator from current time
Initializing worker threads...
Threads started!
[ 30s ] thds: 300 tps: 189.42 qps: 3911.05 (r/w/o: 2753.06/769.16/388.83) lat (ms,95%): 3151.62 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 300 tps: 406.65 qps: 8146.63 (r/w/o: 5702.77/1630.57/813.30) lat (ms,95%): 1903.57 err/s: 0.00 reconn/s: 0.00
[ 90s ] thds: 300 tps: 1027.51 qps: 20561.94 (r/w/o: 14391.74/4115.19/2055.01) lat (ms,95%): 909.80 err/s: 0.00 reconn/s: 0.00
[ 120s ] thds: 300 tps: 915.33 qps: 18308.17 (r/w/o: 12818.23/3659.27/1830.67) lat (ms,95%): 802.05 err/s: 0.00 reconn/s: 0.00
[ 150s ] thds: 300 tps: 848.33 qps: 16954.26 (r/w/o: 11865.99/3391.60/1696.67) lat (ms,95%): 787.74 err/s: 0.00 reconn/s: 0.00
[ 180s ] thds: 300 tps: 1015.47 qps: 20327.15 (r/w/o: 14231.78/4064.44/2030.93) lat (ms,95%): 682.06 err/s: 0.00 reconn/s: 0.00
[ 210s ] thds: 300 tps: 1293.73 qps: 25882.66 (r/w/o: 18120.80/5174.40/2587.47) lat (ms,95%): 493.24 err/s: 0.00 reconn/s: 0.00
[ 240s ] thds: 300 tps: 1705.07 qps: 33979.32 (r/w/o: 23772.88/6803.07/3403.37) lat (ms,95%): 419.45 err/s: 0.00 reconn/s: 0.00
SQL statistics:
    queries performed:
        read:                            3110016
        write:                           888576
        other:                           444288
        total:                           4442880
    transactions:                        222144 (924.53 per sec.)
    queries:                             4442880 (18490.54 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)
General statistics:
    total time:                          240.2250s
    total number of events:              222144
Latency (ms):
         min:                                  2.52
         avg:                                324.16
         max:                              50333.39
         95th percentile:                   1050.76
         sum:                            72010070.69
Threads fairness:
    events (avg/stddev):           740.4800/78.20
    execution time (avg/stddev):   240.0336/0.06

成績(jī)還不錯(cuò),QPS:18490,TPS:924。95%的響應(yīng)時(shí)間是1050ms,就是1秒,可以接受

來(lái)看看600并發(fā)連接線程情況

[root@yw-gz-hd-test-211 ~]# sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host=localhost --mysql-socket=/data/mysql3308/mysql.sock  --mysql-port=3308  --mysql-db=sbtest --mysql-user=root --mysql-password=123456 --table_size=10000000 --tables=10 --threads=600  --time=240 --report-interval=30 run
sysbench 1.0.9 (using system LuaJIT 2.0.4)
Running the test with following options:
Number of threads: 600
Report intermediate results every 30 second(s)
Initializing random number generator from current time
Initializing worker threads...
Threads started!
[ 30s ] thds: 600 tps: 177.45 qps: 3866.55 (r/w/o: 2740.46/751.20/374.88) lat (ms,95%): 6594.16 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 600 tps: 508.61 qps: 10190.12 (r/w/o: 7130.15/2042.76/1017.21) lat (ms,95%): 2828.87 err/s: 0.00 reconn/s: 0.00
[ 90s ] thds: 600 tps: 833.10 qps: 16581.88 (r/w/o: 11603.42/3312.26/1666.20) lat (ms,95%): 1506.29 err/s: 0.00 reconn/s: 0.00
[ 120s ] thds: 600 tps: 712.40 qps: 14275.18 (r/w/o: 9994.28/2856.20/1424.70) lat (ms,95%): 1589.90 err/s: 0.00 reconn/s: 0.00
[ 150s ] thds: 600 tps: 828.53 qps: 16595.37 (r/w/o: 11637.94/3300.27/1657.17) lat (ms,95%): 1280.93 err/s: 0.00 reconn/s: 0.00
[ 180s ] thds: 600 tps: 1152.15 qps: 23046.54 (r/w/o: 16115.87/4626.50/2304.17) lat (ms,95%): 1032.01 err/s: 0.00 reconn/s: 0.00
[ 210s ] thds: 600 tps: 1422.39 qps: 28470.31 (r/w/o: 19918.05/5707.53/2844.74) lat (ms,95%): 707.07 err/s: 0.00 reconn/s: 0.00
[ 240s ] thds: 600 tps: 1874.42 qps: 37511.54 (r/w/o: 26257.48/7505.04/3749.01) lat (ms,95%): 601.29 err/s: 0.00 reconn/s: 0.00
SQL statistics:
    queries performed:
        read:                            3161774
        write:                           903364
        other:                           451682
        total:                           4516820
    transactions:                        225841 (939.46 per sec.)
    queries:                             4516820 (18789.23 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)
General statistics:
    total time:                          240.3923s
    total number of events:              225841
Latency (ms):
         min:                                  2.75
         avg:                                637.78
         max:                              44200.42
         95th percentile:                   1678.14
         sum:                            144036928.60
Threads fairness:
    events (avg/stddev):           376.4017/48.51
    execution time (avg/stddev):   240.0615/0.03

這個(gè)時(shí)候我們看到大量的慢查詢語(yǔ)句,95%響應(yīng)時(shí)間是1678ms,就是1.6秒,有些慢了??纯绰樵兌际切┦裁凑Z(yǔ)句:

# Time: 2018-07-18T14:22:07.662597+08:00
# User@Host: root[root] @ localhost []  Id:   592
# Query_time: 7.400737  Lock_time: 0.000028 Rows_sent: 0  Rows_examined: 1
SET timestamp=1531894927;
UPDATE sbtest5 SET k=k+1 WHERE id=5024619;
# Time: 2018-07-18T14:22:07.662786+08:00
# User@Host: root[root] @ localhost []  Id:   202
# Query_time: 4.220504  Lock_time: 0.000027 Rows_sent: 0  Rows_examined: 1
SET timestamp=1531894927;
UPDATE sbtest5 SET k=k+1 WHERE id=5024572;
# Time: 2018-07-18T14:22:07.662829+08:00
# User@Host: root[root] @ localhost []  Id:   544
# Query_time: 3.662601  Lock_time: 0.000021 Rows_sent: 0  Rows_examined: 1
SET timestamp=1531894927;
DELETE FROM sbtest5 WHERE id=5024577;
# Time: 2018-07-18T14:22:07.662634+08:00
# User@Host: root[root] @ localhost []  Id:   402
# Query_time: 4.832428  Lock_time: 0.000023 Rows_sent: 0  Rows_examined: 1
SET timestamp=1531894927;
UPDATE sbtest5 SET c='53575816661-90198037463-61731021712-17992612508-02527517402-89815419518-53211578757-17129425245-97225103738-94879199437' WHERE id=5024586;

都是更新語(yǔ)句。這些語(yǔ)句非常耗費(fèi)IO的

再來(lái)看看900個(gè)并發(fā)線程的情況。

[root@yw-gz-hd-test-211 ~]# sysbench /usr/share/sysbench/oltp_read_write.lua --db-driver=mysql --mysql-host=localhost --mysql-socket=/data/mysql3308/mysql.sock  --mysql-port=3308  --mysql-db=sbtest --mysql-user=root --mysql-password=123456 --table_size=10000000 --tables=10 --threads=900  --time=240 --report-interval=30 run
sysbench 1.0.9 (using system LuaJIT 2.0.4)
Running the test with following options:
Number of threads: 900
Report intermediate results every 30 second(s)
Initializing random number generator from current time
Initializing worker threads...
Threads started!
[ 30s ] thds: 900 tps: 347.86 qps: 7432.37 (r/w/o: 5273.60/1433.11/725.65) lat (ms,95%): 5124.81 err/s: 0.00 reconn/s: 0.00
[ 60s ] thds: 900 tps: 561.28 qps: 11176.43 (r/w/o: 7801.59/2252.28/1122.55) lat (ms,95%): 10158.80 err/s: 0.00 reconn/s: 0.00
[ 90s ] thds: 900 tps: 643.33 qps: 12944.09 (r/w/o: 9077.29/2580.13/1286.67) lat (ms,95%): 2932.60 err/s: 0.00 reconn/s: 0.00
[ 120s ] thds: 900 tps: 360.53 qps: 7200.07 (r/w/o: 5039.67/1439.33/721.07) lat (ms,95%): 6135.91 err/s: 0.00 reconn/s: 0.00
[ 150s ] thds: 900 tps: 728.53 qps: 14524.71 (r/w/o: 10134.68/2933.03/1457.00) lat (ms,95%): 2585.31 err/s: 0.00 reconn/s: 0.00
[ 180s ] thds: 900 tps: 1268.27 qps: 25410.63 (r/w/o: 17798.37/5075.80/2536.47) lat (ms,95%): 1561.52 err/s: 0.00 reconn/s: 0.00
[ 210s ] thds: 900 tps: 1676.04 qps: 33561.08 (r/w/o: 23477.06/6731.82/3352.21) lat (ms,95%): 1869.60 err/s: 0.00 reconn/s: 0.00
[ 240s ] thds: 900 tps: 2290.01 qps: 45719.85 (r/w/o: 31996.75/9148.79/4574.31) lat (ms,95%): 1352.03 err/s: 0.00 reconn/s: 0.00
SQL statistics:
    queries performed:
        read:                            3318098
        write:                           948028
        other:                           474014
        total:                           4740140
    transactions:                        237007 (985.74 per sec.)
    queries:                             4740140 (19714.74 per sec.)
    ignored errors:                      0      (0.00 per sec.)
    reconnects:                          0      (0.00 per sec.)
General statistics:
    total time:                          240.4346s
    total number of events:              237007
Latency (ms):
         min:                                  2.76
         avg:                                911.43
         max:                              31437.18
         95th percentile:                   2778.39
         sum:                            216015485.39
Threads fairness:
    events (avg/stddev):           263.3411/37.88
    execution time (avg/stddev):   240.0172/0.02

看到了,95%響應(yīng)時(shí)間是2.7秒,數(shù)據(jù)庫(kù)mysql響應(yīng)時(shí)間越來(lái)越慢,越來(lái)越不堪重負(fù)。崩潰就在一瞬間。如我所見,innodb_buffer_pool_size=18G時(shí)候,1000個(gè)并發(fā)線程導(dǎo)致mysqld崩潰了。終于承受不住。

我們來(lái)大概測(cè)算一下,100個(gè)并發(fā)需要多大的內(nèi)存:

并發(fā)數(shù)innodb_buffer_pool_sizemysqld是否崩潰
2005G
3005G崩潰
60018G
90018G
100018G崩潰

看來(lái)100并發(fā)線程,mysqld至少需要2G內(nèi)存,另外考慮留給操作系統(tǒng)占用2G內(nèi)存。所以一個(gè)4核8G機(jī)器,線程數(shù)不要設(shè)置超過(guò)250個(gè)。這個(gè)既是保護(hù)數(shù)據(jù)庫(kù)不崩潰,保證響應(yīng)時(shí)間在合理范圍之內(nèi)(1秒),又是,當(dāng)連接達(dá)到上限的時(shí)候,程序有報(bào)錯(cuò),提示DBA需要增加機(jī)器的內(nèi)存。

看完了這篇文章,相信你對(duì)“如何把mysqld壓測(cè)到崩潰重啟”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI