一、程序管理
企業級資料庫伺服器可能擁有數千個併發訪問資料庫的使用者。某些使用者可能執行只需較少處理能力的簡單事務,而其他使用者則可能執行涉及更多系統資源的複雜事務。 資料庫效能常常基於諸如每小時的事務數或 x個併發連線下的最小響應時間等度量來討論。這些效能約束由企業施加,以便確保客戶的質量保證等級。由於對併發處理具有如此高的需求,企業級資料庫伺服器需要執行於大型 smp伺服器上。早期的 linux核心並不很適合充當需要高併發度的資料庫伺服器。這些核心並沒有隨著系統上的處理器數量的增加而提供良好的擴充套件性,因為早期核心的開發由單處理器機器所驅動。遷移至多處理器平台時需要許多全域性核心鎖的支援,否則會導致序列化問題。 其中最大的鎖是用於保護單個未排序的執行佇列的自旋鎖(spin lock)。 在單處理器環境中, 單個佇列足以排程所有可執行任務。然而, 在 smp環境中, 單個執行佇列並不夠,這會成為乙個瓶頸。隨著處理器數量的增多,在執行佇列上鎖競爭的可能性也增加。另
外,由於該佇列是未排序的,當鎖被持有時排程器需要檢查佇列中的所有任務以便確定每個任務的良好度(每個任務被賦予乙個良好度取值, 用於確定哪個任務將是被排程至處理器上執行的最佳候選)。 這增加了鎖持有時間, 從而增加了鎖競爭的可能性或加劇當前的競爭條件。在 linux 2.5核心中, 這個唯一執行佇列被刪除並替換為基於 cpu的執行佇列。擁有多個執行佇列刪除了對單個全域性鎖的需求並改進了整體的可擴充套件性。另外,每個執行佇列都維護乙個優先順序列表,有助於排程器選擇要執行的最佳任務。這種優先排序可以減少佇列上的鎖持有時間,並進一步減少了鎖競爭 。
二、記憶體管理
管理大型企業的資料庫需要在大型對稱多處理(symmetricalmultiprocessing,smp)伺服器上執行。這種伺服器常常配置了海量物理記憶體。系統的大部分記憶體都被分配給資料庫緩衝區 cache區域(稱為資料庫緩衝區)。資料庫緩衝區用於快取從磁碟讀至記憶體中的表和索引資料頁。由於磁碟訪問相對於記憶體訪問來說是緩慢的操作,將更多記憶體分配給資料庫緩衝區可以極大改進資料庫效能。適當調優的資料庫會占用大部分可用記憶體,而為其他正在執行的應用和作業系統只保留夠用的記憶體大小。為資料庫分配過多記憶體會剝奪其他應用可用的記憶體空間。 另外, 過度分配記憶體會導致過多的交換, 這對於資料庫效能極為有害。
linux核心如何管理物理記憶體對於資料庫伺服器的效能而言也很重要。在 ia-32體系結構中, 核心基於 4kb大小的頁面管理記憶體。 另一方面, 大多數當代的處理器都支援更大的頁面(高達數兆位元組)。對於許多應用來說, 4kb頁面大小是理想的。小頁面可以減少內部分段,將資料換入和換出記憶體時會產生更小的開銷,並確保使用中的虛存駐留於物理記憶體中。大部分資料庫伺服器對於其資料庫緩衝區都使用大型共享記憶體段。其結果是需要大量頁表項(pagetableentrie, pte)。這給記憶體管理器新增了很大的維護開銷。 例如,假若某個資料庫伺服器使用 4mb大小的共享記憶體段為其緩衝區分配 1gb共享記憶體。使用4kb頁面大小的核心需要 262?144個 pte, 這個龐大的頁表數量會給記憶體管理器增添極大的維護開銷。 當然, 上述資料是過分簡化的計算值。 實際的 pte數將遠大於這個數值,因為 linux無法對共享記憶體的頁表進行共享。 linux 2.6核心中提供了對更大頁面的支援。程序可以從記憶體池中顯式請求大頁面。使用大頁面可以減少當應用請求大型記憶體塊時所需的 pte數。因此, 維護 pte所需的計算成本也得以減少。 對於前面的示例, 如果頁面大小是 4mb而不是 4kb, 那麼 1gb資料庫緩衝區只需要 1?024個 pte(這個計算也被過度簡化)。大頁面支援特性的另乙個優點是增加了 tlb(translation lookaside buffer)所覆蓋的記憶體範圍, 從而降低了 tlb不命中的概率。與頁表訪問相比較而言, tlb訪問的速度極快,因為它是 cpu快取區域。
三、i/o 管理 資料庫效能嚴重依賴於高效快速的i/o操作。由於有可能要處理 tb量級的資料,任何 i/o瓶頸都會導致資料庫伺服器難以滿足商業需求。 資料庫管理員(dba)通常花費大量時間和金錢對 i/o子系統進行優化,以便減少 i/o延遲並最大化 i/o吞吐率。早期 linux核心存在著許多阻礙 i/o效能的缺陷,也缺乏諸如原始 i/o、向量 i/o、非同步i/o以及直接 i/o等特性, 這限制了 dba對在其他平台上已知能夠改善資料庫效能的技術加以利用的能力。另外,功能上的匱乏,例如回彈緩衝和單個 i/o請求佇列鎖,增添了不必要的系統成本並引入了序列化問題。 幸運的是, 這些問題在 linux 2.6核心中或通過對2.4核心打補丁都已被消除。
1、回彈緩衝區 在早期的 linux 核心(早期的 2.4及先前的核心版本)中,裝置驅動程式無法直接訪問高階記憶體中的虛址。換句話說,這些裝置驅動程式無法對高階記憶體執行直接記憶體訪問i/o。相反, 核心在低端記憶體中分配緩衝區,資料通過核心緩衝區在高階記憶體和裝置驅動程式之間傳輸。 這個核心緩衝區通常稱為回彈緩衝區(bouncebuffer), 該過程被稱為回彈或回彈緩衝。由於資料庫伺服器的 i/o密集特徵,回彈過程嚴重地降低了資料庫伺服器的效能。首先,回彈緩衝區會消耗低端記憶體,這可能導致記憶體短缺問題。其次,過量的回彈操作會引起系統占用時間較長, 導致資料庫系統完全變成 cpu繫結的。資料庫伺服器效能領域的乙個主要進展即是在最近的核心中消除了回彈緩衝機制。
2、 原始i/o linux 2.4核心中引入的塊裝置原始(raw)i/o介面提供了從使用者空間緩衝區直接執行i/o的能力,而不必通過檔案系統介面進行額外複製。 raw介面的使用避免了檔案系統層次上的操作,因此能夠極大改進資料庫伺服器的 i/o效能。然而,應該注意到,並非所有的資料庫工作負荷都能夠受益於 raw i/o的使用。如果需要經常訪問相同資料, raw i/o就無法利用檔案系統緩衝區 cache。raw i/o介面使得 dba在針對性能目標而進行資料庫設計時具有更多的靈活性。 基於資料庫伺服器的 i/o特徵, dba可選擇使用 raw介面以獲得更快的 i/o操作,或者使用檔案系統快取機制並減少磁碟訪問操作,或者組合使用上述兩種機制,這依賴於對資料庫中的表的訪問方式 。
3、 向量i/o linux 2.6核心通過readv和writev介面提供了向量i/o(vectored i/o,也稱scattered i/o)的完整實現。向量讀操作介面 readv將磁碟上的連續頁面讀入記憶體中的非連續頁面上;與之相反,向量寫操作介面 writev通過單個函式呼叫將記憶體中的非連續頁面寫到磁碟上。這種 i/o機制有利於頻繁執行大量序列 i/o操作的資料庫伺服器。如果沒有正確的向量
讀寫實現,則執行序列 i/o的應用會完成以下操作之一:
執行資料庫頁面大小的 i/o操作。執行大型塊 i/o操作,並使用 memcpy函式在讀/寫緩衝區與資料庫緩衝區之間複製資料頁面。 在掃瞄 tb量級(這是當前資料倉儲的常見規模)的資料時,這兩種方法都會產生昂貴的計算開銷。
4、 非同步i/o 非同步i/o機制為應用提供了發出 i/o請求後無需阻塞並等待該 i/o完成的能力。該機制很適合資料庫伺服器。其他平台提供非同步 i/o介面已有一段時間,但該特性在 linux上還相對較新。在沒有非同步 i/o機制的情況下要提高 i/o吞吐率, 資料庫伺服器通常建立許多專門執行 i/o的程序或執行緒。由於大量程序/執行緒都在執行 i/o活動, 資料庫應用不再阻塞於單個 i/o請求上。 使用大量程序/執行緒方式的缺點是建立、 管理和排程這些程序/執行緒會產生額外的開銷。
gnu c library(glibc)非同步 i/o介面通過使用者級執行緒來執行阻塞 i/o操作。這種方法只是使得請求對於應用而言看起來是非同步的,但與前面描述的方法並無區別,也面臨著同樣的效能缺陷。為了消除該問題, linux 2.6 核心中引入了核心非同步 i/o(kernel asynchronousi/o, kaio)介面。 kaio在核心而不是使用者空間中以執行緒方式實現非同步 i/o
機制,確保了真正的非同步性。
5、 直接i/o 直接 i/o具有可與原始 i/o相媲美的效能,又擁有檔案系統的額外靈活性。因此對於希望在保持資料庫維護靈活性的同時又使用檔案系統作為儲存介質的資料庫管理員來說,直接i/o是具有吸引力的機制。
使用檔案系統而不是 raw裝置作為儲存介質的主要吸引力是因為其易於調整資料庫儲存器的容量。只需新增更多的磁碟就可以增加檔案系統的大小。 檔案系統的另乙個優點是提供了許多可用的工具,例如, dba可以使用 fsck來幫助維護資料完整性。
將檔案系統用作沒有直接 i/o介面的儲存介質也存在著一些缺點。其中之一就是緩衝區 cache守護程序所增加的開銷,該程序會主動地將髒頁面清空到磁碟上。這種活動所消耗的 cpu週期對於 cpu密集的資料庫工作負荷來說是寶貴資源;另乙個缺點與緩衝區cache不命中問題有關。如果資料不經常重用,其開銷會很大。
對於大型資料庫系統而言,會為資料庫緩衝區分配記憶體。大型的資料庫緩衝區降低了資料庫應用的磁碟讀寫頻率,也減少了檔案系統緩衝區 cache可用的記憶體量。這會對伺服器效能產生雙面影響。首先, 緩衝區 cache守護程序更積極地將髒頁面清空到磁碟上(頁面更快地變髒)。 其次, 對於容量更小的緩衝區 cache, 資料駐留於其中的可能性要
小得多,這增加了緩衝區 cache不命中的可能性 。
6、塊i/o 裝置驅動程式以稱為塊的一組位元組為單位來傳輸資料。塊大小被設定為裝置的扇區大小,通常為 512b(儘管許多硬體裝置及其相關驅動程式可以處理更大的傳輸檔案)。 每個塊在記憶體中都關聯著乙個緩衝區頭部結構。當來自應用的讀請求通過read呼叫到達時,裝置驅動程式將讀緩衝區劃分成扇區大小的多個塊,在與每個塊相關的緩衝區頭部裡填
Linux資料庫伺服器的效能調優
資料庫伺服器需要耗用大量系統資源,伺服器效能高度依賴於核心管理這些資源的有效程度。這方面的低效率會導致在核心空間中耗費過多時間。另外,某些特定的低效情況會導致鎖衝突,這會導致擴充套件性低下和序列化問題。這兩個問題都會嚴重影響資料庫效能,因為這兩個問題或者消耗正常情況下應提供給資料庫使用的cpu週期,...
資料庫效能調優 三
影響資料庫效能的主要因素 伺服器硬體的因素 伺服器數量 記憶體 cpu 磁碟 cpu 單台雙cpu 磁碟 高轉速 越高越高,1w以上 硬碟的插槽支援雙通道,記憶體型號一樣.網路環境 盡可能組建分布式的平台,使用raid 資料庫設計 資料查詢 伺服器硬體及網路的建議 增加伺服器的數量,組建分布式平台 ...
高效能linux伺服器核心調優
首先,介紹一下兩個命令 1 dmesg 列印系統資訊。有很多同學們伺服器出現問題,看了程式日誌,發現沒啥有用資訊,還是毫無解決頭緒,這時候,你就需要檢視系統核心丟擲的異常資訊了,使用dmesg命令,可以檢視系統資訊,dmesg c 清除已經看過的資訊。2 sysctl p 生效核心配置 在我們修改核...