真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

mysql怎么做并發(fā) mysql 并發(fā)

如何處理mysql數(shù)據(jù)庫并發(fā)更新問題

現(xiàn)象

為汾陽等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及汾陽網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作、汾陽網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

Sysbench對MySQL進(jìn)行壓測, 并發(fā)數(shù)過大(5k)時(shí), Sysbench建立連接的步驟會(huì)超時(shí).

猜想

猜想: 直覺上這很簡單, Sysbench每建立一個(gè)連接, 都要消耗一個(gè)線程, 資源消耗過大導(dǎo)致超時(shí).

驗(yàn)證: 修改Sysbench源碼, 調(diào)大超時(shí)時(shí)間, 仍然會(huì)發(fā)生超時(shí).

檢查環(huán)境

猜想失敗, 回到常規(guī)的環(huán)境檢查:

MySQL error log 未見異常.

syslog 未見異常.

tcpdump 觀察網(wǎng)絡(luò)包未見異常, 連接能完成正常的三次握手; 只觀察到在出問題的連接中, 有一部分的TCP握手的第一個(gè)SYN包發(fā)生了重傳, 另一部分沒有發(fā)生重傳.

自己寫一個(gè)簡單的并發(fā)發(fā)生器, 替換sysbench, 可重現(xiàn)場景. 排除sysbench的影響

猜想2

懷疑 MySQL 在應(yīng)用層因?yàn)槟撤N原因, 沒有發(fā)送握手包, 比如卡在某一個(gè)流程上:

檢查MySQL堆棧未見異常, 仿佛MySQL在應(yīng)用層沒有看到新連接進(jìn)入.

通過strace檢查MySQL, 發(fā)現(xiàn)?accept()?調(diào)用確實(shí)沒有感知到新連接.

懷疑是OS的原因, Google之, 得到參考文檔:?A TCP “stuck” connection mystery【】

分析

參考文檔中的現(xiàn)象跟目前的狀況很類似, 簡述如下:

正常的TCP連接流程:

Client 向 Server 發(fā)起連接請求, 發(fā)送SYN.

Server 預(yù)留連接資源, 向 Client 回復(fù)SYN-ACK.

Client 向 Server 回復(fù)ACK.

Server 收到 ACK, 連接建立.

在業(yè)務(wù)層上, Client和Server間進(jìn)行通訊.

當(dāng)發(fā)生類似SYN-flood的現(xiàn)象時(shí), TCP連接的流程會(huì)使用SYN-cookie, 變?yōu)?

Client 向 Server 發(fā)起連接請求, 發(fā)送SYN.

Server 不預(yù)留連接資源, 向 Client 回復(fù)SYN-ACK, 包中附帶有簽名A.

Client 向 Server 回復(fù)ACK, 附帶 f(簽名A) (對簽名進(jìn)行運(yùn)算的結(jié)果).

Server 驗(yàn)證簽名, 分配連接資源, 連接建立.

在業(yè)務(wù)層上, Client和Server間進(jìn)行通訊.

當(dāng)啟用SYN-cookie時(shí), 第3步的ACK包因?yàn)?某種原因?丟失, 那么:

從Client的視角, 連接已經(jīng)建立.

從Server的視角, 連接并不存在, 既沒有建立, 也沒有”即將建立” (若不啟用SYN-cookie, Server會(huì)知道某個(gè)連接”即將建立”)

發(fā)生這種情況時(shí):

若業(yè)務(wù)層的第一個(gè)包應(yīng)是從 Client 發(fā)往 Server, 則會(huì)進(jìn)行重發(fā)或拋出連接錯(cuò)誤

若業(yè)務(wù)層的第一個(gè)包應(yīng)是從 Server 發(fā)往 Client的, Server不會(huì)發(fā)出第一個(gè)包. MySQL的故障就屬于這種情況.

TCP握手的第三步ACK包為什么丟失

參考文檔中, 對于TCP握手的第三步ACK包的丟失原因, 描述為:

Some of these packets get lost because some buffer somewhere overflows.

我們可以通過Systemtap進(jìn)一步探究原因.?通過一個(gè)簡單的腳本:

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)

}

觀察結(jié)果, 可以確認(rèn)cookie_v4_check?(syn cookie機(jī)制進(jìn)行包簽名檢查的函數(shù))會(huì)返回 NULL(0). 即驗(yàn)證是由于syn cookie驗(yàn)證不通過, 導(dǎo)致TCP握手的第三步ACK包不被接受.

之后就是對其中不同條件進(jìn)行觀察, 看看是哪個(gè)條件不通過. 最終原因是accept隊(duì)列滿(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;}

恢復(fù)故障與日志的正關(guān)聯(lián)

在故障處理的一開始, 我們就檢查了syslog, 結(jié)論是未見異常.

當(dāng)整個(gè)故障分析完成, 得知了故障與syn cookie有關(guān), 回頭看syslog, 里面是有相關(guān)的信息, 只是和故障發(fā)生的時(shí)間不匹配, 沒有正關(guān)聯(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);

可以看到日志受到了抑制, 因此日志與故障的正關(guān)聯(lián)被破壞.

粗看源碼, 每個(gè)listen socket只會(huì)發(fā)送一次告警日志, 要獲得日志與故障的正關(guān)聯(lián), 必須每次測試重啟MySQL.

解決方案

這種故障一旦形成, 難以檢測; 系統(tǒng)日志中只會(huì)出現(xiàn)一次, 在下次重啟MySQL之前就不會(huì)再出現(xiàn)了; Client如果沒有合適的超時(shí)機(jī)制, 萬劫不復(fù).

解決方案:

1. 修改MySQL的協(xié)議, 讓Client先發(fā)握手包. 顯然不現(xiàn)實(shí).

2. 關(guān)閉syn_cookie. 有安全的人又要跳出來了.

3. 或者調(diào)高syn_cookie的觸發(fā)條件 (syn backlog長度). 降低系統(tǒng)對syn flood的敏感度, 使之可以容忍業(yè)務(wù)的syn波動(dòng).

有多個(gè)系統(tǒng)參數(shù)混合影響syn backlog長度, 參看【】

下圖為精華總結(jié)

請點(diǎn)擊輸入圖片描述

mysql數(shù)據(jù)庫怎么解決高并發(fā)問題

限流算法目前程序開發(fā)過程常用的限流算法有兩個(gè):漏桶算法和令牌桶算法。

漏桶算法

漏桶算法的原理比較簡單,請求進(jìn)入到漏桶中,漏桶以一定的速率漏水。當(dāng)請求過多時(shí),水直接溢出。可以看出,漏桶算法可以強(qiáng)制限制數(shù)據(jù)的傳輸速度。如圖所示,把請求比作是水滴,水先滴到桶里,通過漏洞并以限定的速度出水,當(dāng)水來得過猛而出水不夠快時(shí)就會(huì)導(dǎo)致水直接溢出,即拒絕服務(wù)。

圖片來自網(wǎng)絡(luò)

漏桶的出水速度是恒定的,那么意味著如果瞬時(shí)大流量的話,將有大部分請求被丟棄掉(也就是所謂的溢出)。

令牌桶算法

令牌桶算法的原理是系統(tǒng)以一定速率向桶中放入令牌,如果有請求時(shí),請求會(huì)從桶中取出令牌,如果能取到令牌,則可以繼續(xù)完成請求,否則等待或者拒絕服務(wù)。這種算法可以應(yīng)對突發(fā)程度的請求,因此比漏桶算法好。

圖片來自網(wǎng)絡(luò)

漏桶算法和令牌桶算法的選擇

兩者的主要區(qū)別漏桶算法能夠強(qiáng)行限制處理數(shù)據(jù)的速率,不論系統(tǒng)是否空閑。而令牌桶算法能夠在限制數(shù)據(jù)的平均處理速率的同時(shí)還允許某種程度的突發(fā)流量。如何理解上面的含義呢?漏桶算法,比如系統(tǒng)吞吐量是 120/s,業(yè)務(wù)請求 130/s,使用漏斗限流 100/s,起到限流的作用,多余的請求將產(chǎn)生等待或者丟棄。對于令牌桶算法,每秒產(chǎn)生 100 個(gè)令牌,系統(tǒng)容量 200 個(gè)令牌。正常情況下,業(yè)務(wù)請求 100/s 時(shí),請求能被正常被處理。當(dāng)有突發(fā)流量過來比如 200 個(gè)請求時(shí),因?yàn)橄到y(tǒng)容量有 200 個(gè)令牌可以同一時(shí)刻處理掉這 200 個(gè)請求。如果是漏桶算法,則只能處理 100 個(gè)請求,其他的請求等待或者被丟棄。

如何增加mysql數(shù)據(jù)庫并發(fā)數(shù)

方法一:進(jìn)入MYSQL安裝目錄 打開MYSQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改為 max_connections=1000 服務(wù)里重起MYSQL即可

方法二:MySQL的最大連接數(shù)默認(rèn)是100客戶端登錄:mysql -uusername -ppassword

設(shè)置新的最大連接數(shù)為200:mysql set GLOBAL max_connections=200

顯示當(dāng)前運(yùn)行的Query:mysql show processlist

顯示當(dāng)前狀態(tài):mysql show status

退出客戶端:mysql exit

查看當(dāng)前最大連接數(shù):mysqladmin -uusername -ppassword variables


網(wǎng)頁標(biāo)題:mysql怎么做并發(fā) mysql 并發(fā)
本文路徑:http://weahome.cn/article/ddodics.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部