亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 3023 | 回復(fù): 0
打印 上一主題 下一主題

如何避免MySQL使用Linux的SWAP分區(qū) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-09-17 20:09 |只看該作者 |倒序瀏覽
Linux有很多很好的內(nèi)存、IO調(diào)度機(jī)制,但是并不會適用于所有場景。對于DBA來說Linux比較讓人頭疼的一個地方是,它不會因為MySQL很重要就避免將分配給MySQL的地址空間映射到swap上。對于頻繁進(jìn)行讀寫操作的系統(tǒng)而言,數(shù)據(jù)看似在內(nèi)存而實際上在磁盤是非常糟糕的,響應(yīng)時間的增長很可能直接拖垮整個系統(tǒng)。這篇blog主要講講我們作為DBA,怎樣盡量避免MySQL慘遭swap的毒手。

首先我們要了解點基礎(chǔ)的東西,比如說為什么會產(chǎn)生swap。假設(shè)我們的物理內(nèi)存是16G,swap是4G。如果MySQL本身已經(jīng)占用了12G物理內(nèi)存,而同時其他程序或者系統(tǒng)模塊又需要6G內(nèi)存,這時候操作系統(tǒng)就可能把MySQL所擁有的一部分地址空間映射到swap上去。

cp一個大文件,或用mysqldump導(dǎo)出一個很大的數(shù)據(jù)庫的時候,文件系統(tǒng)往往會向Linux申請大量的內(nèi)存作為cache,一不小心就會導(dǎo)致L使用swap。這個情景比較常見,以下是最簡單的三個調(diào)整方法:



① /proc/sys/vm/swappiness的內(nèi)容改成0(臨時),/etc/sysctl.conf上添加vm.swappiness=0(永久)
這個參數(shù)決定了Linux是傾向于使用swap,還是傾向于釋放文件系統(tǒng)cache。在內(nèi)存緊張的情況下,數(shù)值越低越傾向于釋放文件系統(tǒng)cache。
當(dāng)然,這個參數(shù)只能減少使用swap的概率,并不能避免Linux使用swap。
② 修改MySQL的配置參數(shù)innodb_flush_method,開啟O_DIRECT模式。
這種情況下,InnoDB的buffer pool會直接繞過文件系統(tǒng)cache來訪問磁盤,但是redo log依舊會使用文件系統(tǒng)cache。值得注意的是,Redo log是覆寫模式的,即使使用了文件系統(tǒng)的cache,也不會占用太多。
③ 添加MySQL的配置參數(shù)memlock
這個參數(shù)會強(qiáng)迫mysqld進(jìn)程的地址空間一直被鎖定在物理內(nèi)存上,對于os來說是非常霸道的一個要求。必須要用root帳號來啟動MySQL才能生效。
還有一個比較復(fù)雜的方法,指定MySQL使用大頁內(nèi)存(Large Page)。Linux上的大頁內(nèi)存是不會被換出物理內(nèi)存的,和memlock有異曲同工之妙。
以上介紹了MySQL如何避免使用swap的方法。下面需要補充一下原理和實現(xiàn)機(jī)制,對于Linux api不感興趣的同學(xué)可以直接跳過。

一、操作系統(tǒng)設(shè)置swap的目的
程序運行的一個必要條件就是足夠的內(nèi)存,而內(nèi)存往往是系統(tǒng)里面比較緊張的一種資源。為了滿足更多程序的要求,操作系統(tǒng)虛擬了一部分內(nèi)存地址,并將之映射到swap上。對于程序來說,它只知道操作系統(tǒng)給自己分配了內(nèi)存地址,但并不清楚這些內(nèi)存地址到底映射到物理內(nèi)存還是swap。
物理內(nèi)存和swap在功能上是一樣的,只是因為物理存儲元件的不同(內(nèi)存和磁盤),性能上有很大的差別。操作系統(tǒng)會根據(jù)程序使用內(nèi)存的特點進(jìn)行換入和換出,盡可能地把物理內(nèi)存留給最需要它的程序。但是這種調(diào)度是按照預(yù)先設(shè)定的某種規(guī)則的,并不能完全符合程序的需要。一些特殊的程序(比如MySQL)希望自己的數(shù)據(jù)永遠(yuǎn)寄存在物理內(nèi)存里,以便提供更高的性能。于是操作系統(tǒng)就設(shè)置了幾個api,以便為調(diào)用者提供“特殊服務(wù)”。

二、Linux提供的幾個api

1、mlockall()和munlockall()
這一對函數(shù),可以讓調(diào)用者的地址空間常駐物理內(nèi)存,也可以在需要的時候?qū)⒋颂貦?quán)取消。mlockall()的flag位可以是MCL_CURRENT和MCL_FUTURE的任意組合,分別代表了“保持已分配的地址空間常駐物理內(nèi)存”和“保持未來分配的地址空間常駐物理內(nèi)存”。對于Linux來說,這對函數(shù)是非常霸道的,只有root用戶才有權(quán)限調(diào)用。

2、shmget()和shmat()
這一對函數(shù),可以向操作系統(tǒng)申請使用大頁內(nèi)存(Large Page)。大頁內(nèi)存的特點是預(yù)分配和永駐物理內(nèi)存,因為使用了共享內(nèi)存段的方式,page table有可能會比傳統(tǒng)的小頁分配方式更小。對于多進(jìn)程共享內(nèi)存的程序(比如ORACLE),大頁內(nèi)存能夠節(jié)省很多page table開銷;而對于MySQL來說,性能和資源開銷都沒有顯著變化,好處就在于減少了內(nèi)存地址被映射到swap上的可能。至于為什么是減少,而不是完全避免,之后再講解。

3、O_DIRECT和posix_memalign()
以上兩個方法都不會減少內(nèi)存的使用量,調(diào)用者的本意是獲取更高的系統(tǒng)特權(quán),而不是節(jié)約系統(tǒng)資源。O_DIRECT是一種更加理想化的方式,通過避免double buffer,節(jié)省了文件系統(tǒng)cache的開銷,最終減少swap的使用率。O_DIRECT是Linux IO調(diào)度相關(guān)的標(biāo)志,在open函數(shù)里面調(diào)用。通過O_DIRECT標(biāo)志打開的文件,讀寫都不會用到文件系統(tǒng)的cache。傳統(tǒng)的數(shù)據(jù)庫(ORACLE、MySQL)基本都有O_DIRECT相關(guān)的開關(guān),在提高性能的同時,也減少了內(nèi)存的使用。至于posix_memalign(),是用來申請對齊的內(nèi)存地址的。只有用posix_memalign()申請的內(nèi)存地址,才能用來讀寫O_DIRECT模式下的文件描述符。

4、madvise()和fadvise()
這對函數(shù)也是比較溫和的,可以將調(diào)用者對數(shù)據(jù)訪問模式的預(yù)期傳遞給Linux,以期得到更好的性能。
我們比較感興趣的是MADV_DONTNEED和FADV_NOREUSE這兩個flag。前者會建議Linux釋放指定的內(nèi)存區(qū)域,而后者會建議文件系統(tǒng)釋放指定文件所占用的cache。

三、MySQL內(nèi)存使用相關(guān)的一些代碼

1、memlock
在MySQL的源碼目錄里面查詢memlock,可以知道這個參數(shù)的作用是使MySQL調(diào)用mlockall()。在源碼里面匹配可以得知NDB、MyISAM和mysqld都調(diào)用了mlockall()。NDB是可以獨立于MySQL而存在的存儲引擎,此處按下不表。mysqld調(diào)用mlockall()的方式有點出乎意料,在init_server_components()函數(shù)里傳給mlockall()的flag是MCL_CURRENT,也就是說之后申請的內(nèi)存一概不用鎖住。再看看MyISAM的調(diào)用順序是:mlockall() <- lock_memory() <- mi_repair(),MyISAM只有修復(fù)的時候會調(diào)用mlockall()函數(shù)。

2、large-pages
根據(jù)Linux的內(nèi)核文檔,大頁內(nèi)存有兩種方法可以用到:一種是創(chuàng)建hugetlb類型的文件,并將它mmap到程序的內(nèi)存地址里面,然后進(jìn)行正常的讀寫操作。另外一種是之前說到的shmget()+shmat(),也正是MySQL采用的方式。在MySQL的源碼目錄里面匹配shmget,可以發(fā)現(xiàn)BDB、NDB、InnoDB、MyISAM都調(diào)用了這個函數(shù)。接著看一下比較常用的InnoDB和MyISAM引擎。
在InnoDB里面可以找到os_mem_alloc_large()調(diào)用了shmget(),而調(diào)用os_mem_alloc_large()的函數(shù)只有buf_pool_init()——InnoDB Buffer Pool的初始化函數(shù)。根據(jù)觀察得到的結(jié)論是,InnoDB會根據(jù)配置參數(shù)在Buffer Pool里面使用大頁內(nèi)存,Redo log貌似就沒有這個待遇了。
對于MyISAM,在storage層級的代碼里面找不到對shmget()的直接調(diào)用。這是因為MyISAM是MySQL的原生存儲引擎,很多函數(shù)存放在上一層的mysys目錄里面。通過搜索shmget(),我們可以找到MyISAM的調(diào)用順序是這樣的:shmget() <- my_large_malloc_int() <- my_large_malloc() <- init_key_cache()。也就是說MyISAM只有索引緩存用到了大頁內(nèi)存,這是很容易理解,因為MyISAM的數(shù)據(jù)是直接扔給文件系統(tǒng)做緩存的,沒法使用大頁內(nèi)存。

3、innodb_flush_method
O_DIRECT是BDB、NDB、InnoDB特有的參數(shù),在這里只討論InnoDB這個比較常見的引擎。在InnoDB的源碼目錄里面匹配O_DIRECT,很容易找到一個叫做os_file_set_nocache()的函數(shù),而這個函數(shù)作用是將文件的打開方式改為O_DIRECT模式。再跟蹤一下,會發(fā)現(xiàn)只有os_file_create()函數(shù)調(diào)用了os_file_set_nocache()。雖然函數(shù)名里面還有create,實際上os_file_create()會根據(jù)傳入?yún)?shù)的不同,選擇打開或者新建一個文件。同時os_file_create()還會根據(jù)MySQL的配置,來調(diào)用os_file_set_nocache()關(guān)閉文件系統(tǒng)的相應(yīng)cache。在os_file_create()函數(shù)里面有如下一段代碼:/* We disable OS caching (O_DIRECT) only on data files */if (type != OS_LOG_FILE &&srv_unix_file_flush_method == SRV_UNIX_O_DIRECT){os_file_set_nocache(file, name, mode_str);}
這段代碼的意思是,只有InnoDB的數(shù)據(jù)文件有資格使用O_DIRECT模式,Redo log是不能使用的。以上的分析基于5.0.85版本的原版MySQL,InnoDB是Innobase。版本不同情況下可能會有一些出入,歡迎參與討論。

參考文獻(xiàn):
Virtual memory@wiki
All about Linux swap space
HugeTLB – Large Page Support in the Linux Kernel
Page table@wiki


本文鏈接地址:http://www.linuxde.net/2011/09/808.html 文章轉(zhuǎn)載自Linux每日一文
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP