最近幾個站點出現負載過高,磁碟io過高,通過iotop命令檢視,發現程序為mysqld的讀資料操作很高。基本上在200mb/s。已經到達了100%了。
在網上找了好幾天都是說binglog提交,
set global sync_binlog=500;
當每進行500次事務提交之後,mysql將進行一次fsync之類的磁碟同步指令來將binlog_cache中的資料強制寫入磁碟。
set global innodb_flush_log_at_trx_commit=2;
他們說的症狀基本上是寫操作io過高。跟我碰到的不一樣。
一直在優化sql語句上下功夫,該 加的索引都加上了,效果不明顯。不斷的查資料,最後在一篇文章中受到啟發。
在mysql執行查詢操作時,有order by排序時或查詢都會生成臨時表。一般會存在記憶體裡。但是如果記憶體不足時會存在磁碟上。
翻開寶塔的mysql配置,果然有個tmp_table_size來控制臨時表所佔記憶體。
既然這樣,調大這個記憶體值就可以解決這個問題了。
最近又發現,這根mysql的引擎有關,myisam的話所有的臨時表都會存在磁碟上。而innodb的話則會存在記憶體中。
如果表是myisam的話,最好改為innodb .
如何選擇:
1. 是否要支援事務,如果要請選擇innodb,如果不需要可以考慮myisam;
2. 如果表中絕大多數都只是讀查詢,可以考慮myisam,如果既有讀寫也挺頻繁,請使用innodb。
3. 系統奔潰後,myisam恢復起來更困難,能否接受;
4. mysql5.5版本開始innodb已經成為mysql的預設引擎(之前是myisam),說明其優勢是有目共睹的,如果你不知道用什麼,那就用innodb,至少不會差。
mysql 磁碟讀寫的I O優化
在 mysql 5.1.x 版本中曾使用引數innodb file io threads,指負責處理資料頁上讀寫io請求的後台執行緒數量。在 mysql 5.5.x 中拆成2個引數 innodb read io threads,innodb write io threads。該引數值之和 2 cpu...
磁碟IO的概念
讀 寫io,最為常見說法,讀io,就是發指令,從磁碟讀取某段扇區的內容。指令一般是通知磁碟開始扇區位置,然後給出需要從這個初始扇區往後讀取的連續扇區個數,同時給出動作是讀,還是寫。磁碟收到這條指令,就會按照指令的要求,讀或者寫資料。控制器發出的這種指令 資料,就是一次io,讀或者寫。提公升磁碟io的...
磁碟 I O 的概念
i o 的概念,從字義來理解就是輸入輸出。作業系統從上層到底層,各個層次之間均存在 i o。比如,cpu 有 i o,記憶體有 i o,vmm 有 i o,底層磁碟上也有 i o,這是廣義上的 i o.通常來講,乙個上層的 i o 可能會產生針對磁碟的多個 i o,也就是說,上層的 i o 是稀疏的...