監控硬件是早期的重要步驟
從以前的章節裡(使用性能監視器),你可以找出一些潛在的硬件性能瓶頸。這一節裡,我們將查看SQLServer硬件的每一個主要組件,以幫助最優化你硬件的性能。
將分以下幾個部分進行:
CPU Memory Disk Storage Network Connectivity Misc.作為監控的一部分,你需要完成上面的列表,這樣,你就會對你的服務器無所不知了。
CPUCPU的數量
這第一個是顯而易見的,越多的CPU性能越快。SQLServer2000的標准版支持4個CPU。企業版支持最多32個CPU,具體根據操作系統而定。更多的CPU對於全面提升SQLServer的性能是很有效的。 對任何一個基於SQLServer的應用程序需要的CPU數量進行估算是很困難的。這是因為每個應用程序的工作都是不同的,並且它們的使用也不同。有經驗的 DBA總是對應用程序需要什麼樣的CPU有個大概的了解,卻很難真正知道需要什麼樣的CPU,直到在真實條件下測試了服務器的配置。由於選擇合適的CPU的數量是困難的,所以你可以考慮下面的原則:
盡可能的購買更多CPU數量的服務器。如果你做不到,那麼至少要購買一個能擴展CPU數量的服務器。幾乎所以的SQLServer在工作量增加時都需要更多的動力。這是一些潛在的假設:
SQLServer將僅僅用來運行一個同時不超過5個用戶的財務應用程序,並且你預期未來兩年不會改變。如果是這樣,單CPU的服務器就足夠用了。如果預期用戶數量在不久會增加的話,那麼你需要考慮購買一個單CPU的,並且擁有可擴展一個CPU數量的服務器以備不時之需。 SQLServer 用來運行一個內部的寫程序,這個程序不僅僅包括OLTP,而且需要支持繁重的報表需求。預期用戶同時不會超過25個。如果是這樣,你需要考慮一個雙CPU 的服務器,但是它應該可以擴展到4個CPU。“繁重的報表需求”的真正含義是很難預計的。我曾經看到一些相當簡單,但是不好的寫報表,占用了服務器全部的 CPU。 SQLServer運行一個目前用戶為100到150之間的ERP包。對於象這樣的“重型”程序,詢問推薦的硬件配置。因為他們已經對他們的產品需要的CPU配置有了一個很好的建議。我能提供一些其他的例子,但是通過這些我發現:正確預計基於SQLServer的一個特殊的應用程序的CPU的數量是很困難的。你通常應該購買一個比你認為要大的系統,因為在許多情況下,一個應用程序的使用需求經常是被低估了的。現在購買一個有多個CPU的大服務器來長期使用也不是很昂貴了,總比你在6到 12個月後由於當初的低估不得不重新替換你整個服務器要劃算得多。
CPU速度
象CPU的數量一樣,需要的CPU的速度 也是很難估計的。一般說來,盡量購買最快的CPU。購買速度快的總是好於速度慢的。
CPU 2級緩存
我曾經遇到一個比較普遍的問題:購買2級緩存較小的便宜的CPU好呢,還是購買2級緩存較大的昂貴的至強CPU好?事實上,在購買2級緩存較小的更快的芯片和購買較大2級緩存的芯片上做出決定是很困難的。這裡有一些規則:如果你僅有1、2個CPU,那麼盡量買最快的,其次才考慮2級緩存。如果你一定要選擇2級緩存大小的話,盡量選擇較大的。但是,如果你有4個或更多的CPU,那麼你需要較大2級緩存的CPU,即使它們的速度不太高。這是因為對於一個有4個或更多CPU的服務器來說,要想盡量讓SQLServer運行良好的話,2級緩存一定要大,否則將浪費額外的CPU。CPU監控列表
既然本文是關於你SQLServer目前CPU性能的一個監控,那麼你現在應該關注你目前的服務器是否存在CPU瓶頸。正如在《使用性能監視器找出硬件瓶頸》一文所討論的那樣,你可以使用性能監視器幫助你找到硬件瓶頸。 如果你CPU目前沒有瓶頸問題,那麼你可以忽略下一部分關於memory的討論。但如果你的服務器目前存在CPU瓶頸,並且是主要的性能問題,那麼你可以選擇以下的方法去解決瓶頸:減少服務器的負荷。可以通過減少用戶數量、調優查詢、調優索引、除去在服務器上運行的不必要的程序來達到目的。另外如果你的產品服務器上還運行有關於報表的程序,將其移到一個專門為報表做的服務器上。如果CPU瓶頸是由於缺少服務器內存引起的,請添加更多的內存。這是一個普遍的問題。如果你目前的服務器有更多的CPU插槽,那麼請添加更多的CPU。如果可以的話,用更快的CPU升級你的服務器。購買一個新的有更多更快CPU的服務器。不幸的是,這些方法在處理CPU瓶頸時也不是輕而易舉的,當然除非你們公司有足夠的錢。作為一個DBA來說,你可能唯一能做的就是“減少服務器的負荷”這一項了。
內存
在討論完CPU後,現在開始討論內存,不要認為它不象CPU那麼重要。事實上,內存可能是任何SQLServer服務器最重要的硬件部分,它比其他硬件更能影響SQLServer的性能。當我們討論內存的時候,一般指的是物理內存,而不是虛擬內存。SQLServer不是設計來用虛擬內存的,盡管它也能用。
並非聯合使用操作系統的物理內存和虛擬內存,SQLServer總是盡可能的使用物理內存。這主要是為了提高速度。訪問內存中的數據總是比訪問磁盤上的快得多。 SQLServer不能總是把數據放在內存(SQLServer緩存)中,它也訪問磁盤,就像操作系統管理虛擬內存一樣。但SQLServer的“緩存”機制比操作系統的虛擬內存更快更詭異。 快速的知道SQLServer是否有足夠內存的方法是檢查SQLServer的緩存命中率(在《使用performance Monitor找出硬件瓶頸》一文有過討論)。如果這個計數器為99%或者更高,說明有足夠的內存。如果這個計數器在90%與99%之間並且你對性能比較樂觀的話,那麼你的SQLServer可能有足夠的內存,但是如果你不滿意服務器性能的話,則需要添加內存了。如果這個計數器少於90%,關鍵在於性能無法被接受(如果運行的是OLAP,少於90%通常也沒問題),所以需要添加更多的內存。
SQLServer的物理內存的理想值應該超過服務器上最大數據庫的大小。這總是不可能的,因為許多數據庫是非常大的。如果你正在計算 SQLServer 的大小,並且有足夠的預算,那麼盡量去購買能容納整個數據庫大小的物理內存。假定你的數據庫是4G或者更小,那麼這通常不會成太大的問題。但是如果你的數據庫更大(或者預期會超過4G),那麼你可能容易地提供超過4G的內存。SQLServer2000企業版支持高達64G的內存,沒有太多的服務器支持這麼大的內存。 即使SQLServer的緩存不能容納整個數據庫,SQLServer仍然能快速的獲取數據。99%的緩存命中率意味著SQLServer需要的數據99% 的時間都是在緩存中的,性能非常快。例如,我管理一個30G的數據庫,但是服務器僅有4G的內存,而緩存命中率總是高於99.6%。這意味著大多數情況下用戶沒有同時訪問數據庫裡所有的數據,僅僅一小部分而已,SQLServer也能將經常訪問的數據始終放在緩存中,所以99%的請求在這種情況下能迅速完成,即使服務器的內存少於數據庫的大小。 那麼,要點是什麼呢?如果你的緩存命中率少於90%,那麼認真的考慮添加更多的內存了。