您好,登錄后才能下訂單哦!
昨天使用gdb調試MySQL中事務臨界狀態的時候,發現其實有些場景可能比我想得還要復雜一些,所以我在昨天的測試中結尾也是快快掃過,但是表明了意思即可。這一點上我在后面會把Oracle的臨界事務狀態也拿出來對比一下,還是蠻有意思的。
今天簡單寫了幾個腳本繼續對一個測試環境的MySQL進行sysbench壓力測試。
先突破1000連接資源設置的瓶頸在上一次的基礎上,我們保證了能夠滿足短時間內1000個連接的沖擊,從各個方面做了調整,其中的一個重點逐漸落到了IO的吞吐率上,redo日志的大小設置一下子成了焦點和重中之重。
當然這次的測試中,我的思路還是保持性能持續的增長,邊調整,邊優化。
首先一點是我們能夠突破1000連接的大關,先用下面的腳本來進行一個初步的測試,測試時長10秒鐘,看看能否初始化1500個連接。
sysbench /home/sysbench/sysbench-1.0.3/src/lua/oltp_read_write.lua --mysql-user=root --mysql-port=3306 --mysql-socket=/home/mysql/s1/s1.sock --mysql-host=localhost --mysql-db=sysbenchtest --tables=10 --table-size=5000000 --threads=1500 --report-interval=5 --time=10 run沒想到就跟約好似的,拋出了如下的錯誤。注意這里的錯誤看起來已經不是數據庫層面了。
FATAL: unable to connect to MySQL server on socket '/home/mysql/s1/s1.sock', aborting...
FATAL: error 2001: Can't create UNIX socket (24)
PANIC: unprotected error in call to Lua API (cannot open
/home/sysbench/sysbench-1.0.3/src/lua/oltp_read_write.lua: Too many open
files)
PANIC: unprotected error in call to Lua API (cannot open
/home/sysbench/sysbench-1.0.3/src/lua/oltp_read_write.lua: Too many open
files)是不是支持的socket數的限制呢,我們已經調整了process的值。上面的命令我們可以換個姿勢來寫,那就是從socket連接改為常用的TCP/IP方式的連接.
sysbench /home/sysbench/sysbench-1.0.3/src/lua/oltp_read_write.lua --mysql-user=perf_test --mysql-port=3306 --mysql-host=10.127.128.78 --mysql-password=perf_test --mysql-db=sysbenchtest --tables=10 --table-size=5000000 --threads=1500 --report-interval=5 --time=10 run可以看到錯誤就顯示不同了,但是已經能夠看出意思來了。
FATAL: unable to connect to MySQL server on host '10.127.128.78', port 3306, aborting...
FATAL: error 2004: Can't create TCP/IP socket (24)
PANIC: unprotected error in call to Lua API (cannot open /home/sysbench/sysbench-1.0.3/src/lua/oltp_read_write.lua: Too many open files)
PANIC: unprotected error in call to Lua API (cannot open /home/sysbench/sysbench-1.0.3/src/lua/oltp_read_write.lua: Too many open files)對此應很明確了,那就是內核資源設置nofile調整一下。
修改/etc/security/limits.d/90-nproc.conf文件,添加如下的部分即可,重新登錄后即可生效。
* soft nproc 65535
* soft nofile 65535
* hard nofile 65535
重啟MySQL后可以看到設置生效了。# cat /proc/`pidof mysqld`/limits | egrep "(processes|files)"
Max processes 65535 256589 processes
Max open files 65535 65535 files
我們繼續開啟壓測模式,馬上錯誤就變了樣。是我們熟悉的一個錯誤,最開始就碰到了。
FATAL: `thread_init' function failed: /usr/local/share/sysbench/oltp_common.lua:273: SQL API error
(last message repeated 1 times)
FATAL: mysql_stmt_prepare() failed
FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 100000)"
FATAL: `thread_init' function failed: /usr/local/share/sysbench/oltp_common.lua:273: SQL API error
這里得簡單說說幾個相關的額參數。
Com_stmt_close prepare語句關閉的次數
Com_stmt_execute prepare語句執行的次數
Com_stmt_prepare prepare語句創建的次數這一類的場景可能不是通用的,因為在有些場景下,持續的連接,不是短時間內的大批量連接,這個參數max_prepared_stmt_count其實也不一定需要設置非常大。
比如我手頭一個環境連接數有近500,但是max_prepared_stmt_count還是默認值16382,也穩定運行了很長時間了。# mysqladmin pro|wc -l
424
# mysqladmin var|grep max_prepared_stmt_count
| max_prepared_stmt_count | 16382
我們的這個壓測場景中,會短時間內創建大量的連接,而考慮到性能和安全,會使用prepare的方式,我們以10秒內的sysbench連接測試威力,看看prepare statement的數量變化。
使用show global status like '%stmt%'能夠得到一個基本的數據變化。
mysql> show global status like '%stmt%';
+----------------------------+--------+
| Variable_name | Value |
+----------------------------+--------+
| Com_stmt_execute | 477403 |
| Com_stmt_close | 91000 |
| Com_stmt_fetch | 0 |
| Com_stmt_prepare | 298844 |
| Com_stmt_reset | 0 |
| Com_stmt_send_long_data | 0 |
| Com_stmt_reprepare | 0 |
| Prepared_stmt_count | 0 |
+----------------------------+--------+過幾秒查看,可以看到Prepared_stmt_count已經接近閾值。
mysql> show global status like '%stmt%';
+----------------------------+--------+
| Variable_name | Value |
+----------------------------+--------+
| Binlog_stmt_cache_disk_use | 0 |
| Binlog_stmt_cache_use | 0 |
| Com_stmt_execute | 477403 |
| Com_stmt_close | 91000 |
| Com_stmt_fetch | 0 |
| Com_stmt_prepare | 398045 |
| Com_stmt_reset | 0 |
| Com_stmt_send_long_data | 0 |
| Com_stmt_reprepare | 0 |
| Prepared_stmt_count | 98091 |
+----------------------------+--------+
按照目前的一個基本情況,我們需要 設置為91*1500=136500,留有一定的富余,所以我們可以設置為150000
然后繼續測試,就會看到這個參數逐步的飛升。
mysql> show global status like '%stmt%';
+----------------------------+--------+
| Variable_name | Value |
+----------------------------+--------+
| Binlog_stmt_cache_disk_use | 0 |
| Binlog_stmt_cache_use | 0 |
| Com_stmt_execute | 624184 |
| Com_stmt_close | 91000 |
| Com_stmt_fetch | 0 |
| Com_stmt_prepare | 537982 |
| Com_stmt_reset | 0 |
| Com_stmt_send_long_data | 0 |
| Com_stmt_reprepare | 0 |
| Prepared_stmt_count | 136500 |
+----------------------------+--------+整個加壓的過程中,可以通過top看到負載還是有一定的潛力,離性能榨干還有距離。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
13417 mysql 20 0 34.8g 11g 12m S 1324.2 35.2 19:18.71 /usr/local/mysql/bin/mysqld --defaults-file=/home
23108 root 20 0 8924m 1.6g 2148 S 212.3 5.0 1:32.73 sysbench /home/sysbench/sysbench-1.0.3/src/lua/olt
下面的圖是我使用100M,200M,500,1G的redo得到的TPS圖。
通過這個圖也能過看出一個基本的負載情況,在1G的時候,TPS相對比較平穩,但是redo切換還是多多少少都會有一定的抖動。當然redo不是越大越好,
5.5 中的設置是小于 4G, 5.6 以后是小于512G
我們持續進行優化。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。