原因:最近項目優(yōu)化過程中看铆,偶然發(fā)現(xiàn)本地服務器每過10s就會有一次磁盤爆滿的現(xiàn)象跃赚。在我們的項目中發(fā)現(xiàn)本地項目中存在一個用作“同步數(shù)據(jù)”的定時任務每過10s就查詢數(shù)據(jù)庫表,并把這些信息發(fā)送HTTP請求性湿。
方案:頻繁的數(shù)據(jù)庫請求導致本地的服務器每過10s就產(chǎn)生一次高峰纬傲。在優(yōu)化這個定時任務前,了解到MySQL中的innodb_buffer_pool_size參數(shù)肤频,這個參數(shù)用來設(shè)置Innodb緩沖池大小且默認值為128M叹括。
查看了服務器上的MySQL的innodb_buffer_pool_size參數(shù),大小居然只有8M宵荒。汁雷。。
修改
直接說結(jié)論报咳,innodb_buffer_pool_size的值官方建議在32位機器下設(shè)置為2-3.5G侠讯。我們的服務器是16G,本次設(shè)置成了3G暑刃,就已經(jīng)解決了磁盤爆滿問題厢漩。(數(shù)據(jù)量沒有非常大)
下面是官方關(guān)于innodb_buffer_pool_size屬性的原文:
InnoDB, unlike MyISAM, uses a buffer pool to cache both indexes androw data. The bigger you set this the less disk I/O is needed to access data in tables. On a dedicated database server you may set this parameter up to 80% of the machine physical memory size. Do not set it too large, though, because competition of the physical memory may cause paging in the operating system. Note that on 32bit systems you might be limited to 2-3.5G of user level memory per process, so do not set it too high.
方式一、臨時有效(本次啟動)
-
進入cmd岩臣,輸入mysql -uroot -p溜嗜,輸入密碼登錄MySQL。查看原先緩沖池大屑芑选:
show variables like 'innodb_buffer_pool_size';
- 輸入 set global innodb_buffer_pool_size=緩存池大小炸宵。
這里的單位是B,所以1M是1024 * 1024 * 1 = 1,048,576谷扣,1G是1024 * 1024 * 1024 * 1 = 1,073,741,824土全。如果需要3G空間就是1024 * 1024 * 1024 * 3 = 3221225472
注意:
- 如果新值小于my.ini中的值,這里不會設(shè)置成功。
- 值不是innodb_buffer_pool_instances 或者innodb_buffer_pool_chunk_size 倍數(shù)時裹匙,會自動補正野哭。(下面會介紹這兩個參數(shù))
方式二拨黔、永久生效
修改C:\ProgramData\MySQL\MySQL Server 8.0下的my.ini文件。注意ProgramData是隱藏的绰沥。
- 注意文件的編碼格式篱蝇,用記事本打開寫可能變成utf-8格式,在網(wǎng)上看見有人說這里用utf-8可能會出現(xiàn)問題徽曲,保險起見還是ANSI格式零截。
拓展
這里還需要注意
-
innodb_buffer_pool_instances
innodb_buffer_pool_instances定義 InnoDB緩沖池的實例數(shù),也就是將innodb_buffer_pool_size分成幾個實例秃臣,官方給出的解釋中涧衙,這個參數(shù)的作用為,
innodb_buffer_pool_instances對于緩沖池在數(shù)千兆字節(jié)范圍內(nèi)的系統(tǒng)奥此,通過減少爭用不同線程對緩存頁面進行讀寫的爭用弧哎,將緩沖池劃分為多個單獨的實例可以提高并發(fā)性。設(shè)置緩沖池大小innodb_buffer_pool_size為1G以上時稚虎,默認值是8撤嫩;1G以下時,默認值是1蠢终。
The number of regions that the InnoDB buffer pool is divided into. For systems with buffer pools in the multi-gigabyte range, dividing the buffer pool into separate instances can improve concurrency, by reducing contention as different threads read and write to cached pages.
-
innodb_buffer_pool_chunk_size
用來定義InnoDB緩沖池大小調(diào)整操作的塊大小序攘,my.ini文件中并沒有此項配置,只能在運行時通過show variables like 'innodb_buffer_pool_chunk_size' 查看寻拂,并在運行時通過set global innodb_buffer_pool_chunk_size=塊大小 來設(shè)置程奠。
官方中的解釋為 innodb_buffer_pool_size / innodb_buffer_pool_chunk_size 不應該大于1000。