方法一:進入MYSQL安裝目錄 打開MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改為 max_connections=1000 服務里重起MYSQL即可
創(chuàng)新互聯(lián)主要從事成都網(wǎng)站制作、做網(wǎng)站、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務萊西,十多年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18980820575
方法二:MySQL的最大連接數(shù)默認是100客戶端登錄:mysql -uusername -ppassword
設置新的最大連接數(shù)為200:mysql set GLOBAL max_connections=200
顯示當前運行的Query:mysql show processlist
顯示當前狀態(tài):mysql show status
退出客戶端:mysql exit
查看當前最大連接數(shù):mysqladmin -uusername -ppassword variables
現(xiàn)象
Sysbench對MySQL進行壓測, 并發(fā)數(shù)過大(5k)時, Sysbench建立連接的步驟會超時.
猜想
猜想: 直覺上這很簡單, Sysbench每建立一個連接, 都要消耗一個線程, 資源消耗過大導致超時.
驗證: 修改Sysbench源碼, 調大超時時間, 仍然會發(fā)生超時.
檢查環(huán)境
猜想失敗, 回到常規(guī)的環(huán)境檢查:
MySQL error log 未見異常.
syslog 未見異常.
tcpdump 觀察網(wǎng)絡包未見異常, 連接能完成正常的三次握手; 只觀察到在出問題的連接中, 有一部分的TCP握手的第一個SYN包發(fā)生了重傳, 另一部分沒有發(fā)生重傳.
自己寫一個簡單的并發(fā)發(fā)生器, 替換sysbench, 可重現(xiàn)場景. 排除sysbench的影響
猜想2
懷疑 MySQL 在應用層因為某種原因, 沒有發(fā)送握手包, 比如卡在某一個流程上:
檢查MySQL堆棧未見異常, 仿佛MySQL在應用層沒有看到新連接進入.
通過strace檢查MySQL, 發(fā)現(xiàn)?accept()?調用確實沒有感知到新連接.
懷疑是OS的原因, Google之, 得到參考文檔:?A TCP “stuck” connection mystery【】
分析
參考文檔中的現(xiàn)象跟目前的狀況很類似, 簡述如下:
正常的TCP連接流程:
Client 向 Server 發(fā)起連接請求, 發(fā)送SYN.
Server 預留連接資源, 向 Client 回復SYN-ACK.
Client 向 Server 回復ACK.
Server 收到 ACK, 連接建立.
在業(yè)務層上, Client和Server間進行通訊.
當發(fā)生類似SYN-flood的現(xiàn)象時, TCP連接的流程會使用SYN-cookie, 變?yōu)?
Client 向 Server 發(fā)起連接請求, 發(fā)送SYN.
Server 不預留連接資源, 向 Client 回復SYN-ACK, 包中附帶有簽名A.
Client 向 Server 回復ACK, 附帶 f(簽名A) (對簽名進行運算的結果).
Server 驗證簽名, 分配連接資源, 連接建立.
在業(yè)務層上, Client和Server間進行通訊.
當啟用SYN-cookie時, 第3步的ACK包因為?某種原因?丟失, 那么:
從Client的視角, 連接已經(jīng)建立.
從Server的視角, 連接并不存在, 既沒有建立, 也沒有”即將建立” (若不啟用SYN-cookie, Server會知道某個連接”即將建立”)
發(fā)生這種情況時:
若業(yè)務層的第一個包應是從 Client 發(fā)往 Server, 則會進行重發(fā)或拋出連接錯誤
若業(yè)務層的第一個包應是從 Server 發(fā)往 Client的, Server不會發(fā)出第一個包. MySQL的故障就屬于這種情況.
TCP握手的第三步ACK包為什么丟失
參考文檔中, 對于TCP握手的第三步ACK包的丟失原因, 描述為:
Some of these packets get lost because some buffer somewhere overflows.
我們可以通過Systemtap進一步探究原因.?通過一個簡單的腳本:
probe kernel.function("cookie_v4_check").return
{
source_port = @cast($skb-head + $skb-transport_header, "struct tcphdr")-source
printf("source=%d, return=%d\n",readable_port(source_port), $return)
}
function readable_port(port) {
return (port ((19)-1)) 8 | (port 8)
}
觀察結果, 可以確認cookie_v4_check?(syn cookie機制進行包簽名檢查的函數(shù))會返回 NULL(0). 即驗證是由于syn cookie驗證不通過, 導致TCP握手的第三步ACK包不被接受.
之后就是對其中不同條件進行觀察, 看看是哪個條件不通過. 最終原因是accept隊列滿(sk_acceptq_is_full):
static inline bool sk_acceptq_is_full(const struct sock ?*sk){ ? return sk-sk_ack_backlog sk- ? sk_max_ack_backlog;}
恢復故障與日志的正關聯(lián)
在故障處理的一開始, 我們就檢查了syslog, 結論是未見異常.
當整個故障分析完成, 得知了故障與syn cookie有關, 回頭看syslog, 里面是有相關的信息, 只是和故障發(fā)生的時間不匹配, 沒有正關聯(lián), 因此被忽略.
檢查Linux源碼:
if (!queue-synflood_warned
sysctl_tcp_syncookies != 2
xchg(queue-synflood_warned, 1) == 0)
pr_info("%s: Possible SYN flooding on port %d. %s.
Check SNMP counters.\n",
proto, ntohs(tcp_hdr(skb)-dest), msg);
可以看到日志受到了抑制, 因此日志與故障的正關聯(lián)被破壞.
粗看源碼, 每個listen socket只會發(fā)送一次告警日志, 要獲得日志與故障的正關聯(lián), 必須每次測試重啟MySQL.
解決方案
這種故障一旦形成, 難以檢測; 系統(tǒng)日志中只會出現(xiàn)一次, 在下次重啟MySQL之前就不會再出現(xiàn)了; Client如果沒有合適的超時機制, 萬劫不復.
解決方案:
1. 修改MySQL的協(xié)議, 讓Client先發(fā)握手包. 顯然不現(xiàn)實.
2. 關閉syn_cookie. 有安全的人又要跳出來了.
3. 或者調高syn_cookie的觸發(fā)條件 (syn backlog長度). 降低系統(tǒng)對syn flood的敏感度, 使之可以容忍業(yè)務的syn波動.
有多個系統(tǒng)參數(shù)混合影響syn backlog長度, 參看【】
下圖為精華總結
請點擊輸入圖片描述
在Jmeter中建立一個JDBC
Request
測試計劃主要分兩步。
(1)設置JDBC連接池(在JDBC
Connection
Configuration)
(2)添加JDBC
Request
其他步驟就是設置參數(shù)化、斷言、監(jiān)聽結果。
第一步:添加
JDBC
Connection
Configuration
需要設置jdbc線程池變量的名稱,這里設置為jdbcConfig,這個變量在JDBC
Request中要使用的;還有要設置Database
URL,格式為:jdbc:mysql://localhost:3306/chen?serverTimezone=UTCcharacterEncoding=utf-8,注意:?后面的serverTimezone=UTCcharacterEncoding=utf-8不能缺少,否則會報時區(qū)錯誤。
第二部:設置JDBC
Request
壓力測試工具mysqlslap 使用幫助--help介紹的很詳細,下面是一些常用的選項。根據(jù)幫助文檔就可以自己敲命令進行壓力測試了。
--concurrency代表并發(fā)數(shù)量,多個可以用逗號隔開,當然你也可以用自己的分隔符隔開,這個時候要用到--delimiter開關。
--engines代表要測試的引擎,可以有多個,用分隔符隔開。
--iterations代表要運行這些測試多少次。
--auto-generate-sql 代表用系統(tǒng)自己生成的SQL腳本來測試。
--auto-generate-sql-load-type 代表要測試的是讀還是寫還是兩者混合的(read,write,update,mixed)
--number-of-queries 代表總共要運行多少次查詢。每個客戶運行的查詢數(shù)量可以用查詢總數(shù)/并發(fā)數(shù)來計算。比如倒數(shù)第二個結果2=200/100。
--debug-info 代表要額外輸出CPU以及內存的相關信息。
--number-int-cols 代表示例表中的INTEGER類型的屬性有幾個。
--number-char-cols 意思同上。
--create-schema 代表自己定義的模式(在MySQL中也就是庫)。
--query 代表自己的SQL腳本。
--only-print 如果只想打印看看SQL語句是什么,可以用這個選項。
mysqlslap對于模擬多個用戶同時對MySQL發(fā)起“進攻”提供了方便。同時詳細的提供了“高負荷攻擊MySQL”的詳細數(shù)據(jù)報告。而且如果你想對于多個引擎的性能。這個工具再好不過了。
一個是使用測試工具,比如mysqlslap等等等等。 追問: mysqlslap工具在網(wǎng)上看了,但不知道怎么用啊,能否告知一二?要下載這個工具嗎? 回答: 你要是有MYSQL5系列的數(shù)據(jù)庫,這個工具是自帶的啊。如果沒有,建議下載。 追問: 我是MySql5.1的啊,但還是沒找到在哪兒啊?能否指點一下啊,謝謝! 回答: 暈,你當成可視化的了?無語。你打開控制臺,然后就可以執(zhí)行測試的命令了。你可以參考下MYSQL的官方說明:dev.mysql.com/doc/refman/5.1/en/mysqlslap.html這個網(wǎng)上有很多的測試教程,你可以看看,不過不是特別實用。 追問: 我是應用程序的怎么用啊? 回答: 我看,你可能有點誤解了壓力測試了。第一,你的應用程序,是否是以數(shù)據(jù)為中心的,如果不是,那之前我和你說的那些全部就是廢話。第二,就算是以數(shù)據(jù)為中心的,你也沒說明白你要測試什么,如果你要測試MYSQL,那沒什么必要。因為已經(jīng)是很成熟的產品了。第三,如果是你要測試你的程序,而且你的程序擁有后臺數(shù)據(jù)庫,那你可以針對不同平臺的解決方案,使用不同的測試方法,比如如果是.NET + MYSQL數(shù)據(jù)庫 ,就可以使用VS自帶的測試工具,連同代碼,和數(shù)據(jù)訪問都可以進行測試。
使用--auto-generate-sql參數(shù)表示用mysqlslap工具自己生成的SQL腳本來測試并發(fā)壓力
mysqlslap --auto-generate-sql -uroot -p123456
并發(fā)測試,使用–concurrency來模擬并發(fā)連接,連接數(shù)可以多個,用逗號隔開
mysqlslap --auto-generate-sql --concurrency=100 -uroot -p123456
mysqlslap --auto-generate-sql --concurrency=50,100 -uroot -p123456
使用--iterations模擬迭代測試,用于需要多次執(zhí)行測試得到平均值。
mysqlslap --auto-generate-sql --iterations=5 -uroot -p123456
使用--engine測試不同的存儲引擎的性能進行對比
mysqlslap --auto-generate-sql --concurrency=50,100 --iterations=5 --engine=myisam,innodb -uroot -p123456
--query=name,-q 指定自定義腳本執(zhí)行測試,例如可以調用自定義的一個存儲過程或者sql語句來執(zhí)行測試。--create-schema 指定自定義的測試數(shù)據(jù)庫名稱,
mysqlslap --auto-generate-sql --concurrency=50,100 --create-schema="landclash" --query="call landclash.sp_player_getname(34);" --number-of-queries=5000 -uroot -p123456
分享名稱:mysql怎么設置壓測,mysql 壓測工具
文章URL:http://vcdvsql.cn/article42/hshjhc.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿建站、建站公司、企業(yè)建站、全網(wǎng)營銷推廣、品牌網(wǎng)站建設、網(wǎng)站維護
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)