程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQLServer硬件性能監控列表(2)

SQLServer硬件性能監控列表(2)

編輯:關於SqlServer

磁盤存儲器

在內存之後,磁盤存儲器也是經常影響SQLServer性能的的最重要的因素。 它也是一個復雜的話題。在這部分,我將專注於磁盤存儲器影響性能最容易的地方。

服務器上可用磁盤空間的總量

所有的磁盤陣列至少要20%的可用空間,這樣對性能影響才不是很大。這是因為NTFS(假定你使用的是該磁盤格式)需要額外的空間才能工作得更好。如果沒有可用空間,那麼NTFS不能運行並且性能會降低。它也會導致更多的磁盤碎片,因為服務器讀寫數據更加可能。

查看你SQLServer的每一塊物理磁盤,檢查一下是否有至少20%或者更多的可用空間。如果沒有,考慮以下方法:

刪除磁盤上任何不需要的數據(清空回收站、臨時文件、setup文件等等)刪除一些數據以留出更多的空間添加更多的磁盤空間 

每一個磁盤陣列的物理磁盤數量

一個磁盤陣列通常由2個或者更多的物理磁盤作為一個單一的單元一起工作。例如RAID5陣列也許有4個物理磁盤。那麼為什麼了解你SQLServer的一個或多個磁盤陣列有多少個物理磁盤是很重要的呢?

除鏡像磁盤(兩個物理磁盤一起工作)外,磁盤陣列有越多的物理磁盤,對於磁盤陣列的讀寫就越快。

例如,假如想買一個新的做RAID5的至少有100M可用空間的SQLServer服務器,並要求提供以下兩種不同的磁盤陣列配置:

4個36G的磁盤(可用空間為108G) 7個18G的磁盤(可用空間為108G)按照要求這兩者都符合標准。但是哪一種磁盤陣列能提供更快的讀寫性能呢?答案是第二種,即7個18G的磁盤。為什麼呢?

一般說來,磁盤陣列中磁盤越多,可用來讀寫的磁盤頭就越多。例如,SCSI磁盤可以同時讀和寫數據。所以一個磁盤陣列有越多的物理磁盤,該磁盤陣列的讀寫速度就越快。陣列中的每個磁盤分擔一部分工作量,磁盤越多越好。這兒有一個限制,依賴於磁盤控制器,但通常說來,越多越好。

那麼這對你來說意味著什麼呢?在你查看了你的服務器有多少磁盤陣列、每個磁盤陣列有多少磁盤後,重新配置目前的磁盤陣列以更好的利用是不是可行呢?

例如,假定你目前的服務器有2個磁盤陣列用來存儲用戶數據庫。每一個是3個18G的磁盤組成的RAID5陣列。這種情況下,將兩個陣列重新配置成一個由6個18G的磁盤組成的陣列會更好。這不僅僅提供了更快的I/O,而且也能獲得18G的的磁盤空間。

仔細檢查你目前的配置,你可以改變很多,也許不可以。但是如果你可以改變的話,你將在你改變之後立即從中得到好處。 

SQLServer數據庫通常使用的磁盤陣列的RAID級

或許你已經知道,磁盤陣列有不同類型的配置,稱作RAID級別。每一級別都有各自的擁護者和反對者。下面是一些經常使用的RAID級別的簡單總結,了解後你就知道在你的SQLServer怎樣更好的使用它們:

RAID 1

操作系統(包括虛擬內存)和SQLServer最理想的是運行在RAID1磁盤陣列上。也有人將虛擬內存運行在一個獨立的RAID1磁盤陣列上,但是我對這樣做是否能提供虛擬內存性能表示懷疑,在一個好的配置的服務器上,那不是問題。 

如果你的SQLServer數據庫非常小,所有的數據都能在一個磁盤下存儲,那麼請為你的數據庫文件存儲考慮RAID1級別。

理想地,每一個獨立的事務日志應該運行在一個獨立的RAID1磁盤陣列上。這是因為事務日志在不斷的讀寫,通過放在獨立的磁盤陣列上,由於連續的磁盤I/O不和更慢的隨機的磁盤I/O混合使用,從而使性能得到提升。

RAID 5

盡管這是比較流行的RAID級別,對於最優化SQLServer的I/O性能還不是最好的選擇。如果數據庫的寫操作比例超過10%,大多數OLAP數據庫都是這樣,寫性能會降低,從而傷害整個SQLServer的I/O性能。RAID5最好用於只讀或者大部分時候是讀的數據庫。在微軟的測試發現RAID5比 RAID10幾乎要慢50%。

RAID 10

RAID10為SQLServer數據庫提供了最好的性能,盡管它是最貴的。數據庫的寫操作越多,使用RAID10更重要。

RAID10陣列對於事務日志也是不錯的選擇,假定它只用來存儲單個事務日志。

更可能的是,你目前的SQLServer配置不符合上面的建議。某些情況下,你需要更改你目前的配置以盡量符合上面的建議,但是大多數情況下,你可能不得不忍受直到有新的預算去買新的服務器和磁盤陣列。

如果你只能選擇上面的一個 建議的話,我建議你使用RAID10。這將最大化你SQLServer的I/O性能。 

硬件RAID vs. 軟件RAID

可以通過硬件或者軟件(通過操作系統)實現RAID。不要使用軟件RAID,會很慢,總是使用硬件RAID,這是不爭的事實。

磁盤碎片

如果你在一個嶄新的磁盤陣列上創建了一個新的數據庫,數據庫文件和事務日志文件會是一個連續的文件。但如果數據庫文件或事務日志文件在創建時指定的最大容量裡增長(通常都會超過該容量),隨著時間的推移文件可能會產生碎片。文件碎片(磁盤陣列上分散的許多塊文件)引起你的磁盤陣列在讀寫數據時變慢,從而影響磁盤I/O的性能。

作為性能監控的一部分,你需要了解你的SQLServer數據庫和事務日志是怎樣產生碎片的。如果你使用的是Windows2000或者2003,你可以使用內建的碎片整理工具去分析文件變成碎片的嚴重程度。如果你運行的是NT4.0,那麼你可以借助第三方工具如DisKeeper來進行分析。

如果分析結果需要進行碎片整理,則進行。不幸的是,整理SQLServer數據庫和事務日志的碎片不總是一件容易的事。運行著的文件,象在

SQLServer 上運行的數據庫和事務日志文件,不總是能進行碎片整理。例如,內建的碎片整理工具不能整理SQLServer的MDF和LDF文件,但是 DisKeeper8.0在大多數情況下可以,而不是全部情況都可以。這意味著在某些情況下,為了整理SQLServer的MDF和LDF文件的碎片,你不得不使SQLServer離線。依賴文件整理的方式、文件的大小、這可能需要花費很多小時。

你真有必要對數據庫文件進行碎片整理嗎?如果你的I/O性能目前比較適中,那麼你不需要進行碎片整理。但是如果你的I/O性能是個瓶頸的話

,碎片整理是一個提升性能的便捷之道,盡管大多數情況下會花費一些時間。

理想地,你應該周期性的整理你的SQLServer數據庫和事務日志碎片。這樣,你能確信沒有I/O性能問題。 

操作系統

為了最佳性能,操作系統文件和SQLServer數據庫文件(MDF、LDF文件)不要放在一個磁盤陣列上。另外,操作系統文件應該放在一個支持

RAID1、5或10的磁盤陣列上。

和大多數人一樣,通常我也是在服務器的C盤上安裝操作系統。並且為了容錯和最好的性能將C盤配置為RAID1的鏡像磁盤。

在大多數情況下, 只要你不把操作系統和SQLServer數據文件放在同一個磁盤陣列上,你在服務器上處理操作系統文件就會獲得很大的性能。

SQLServer程序

象操作系統文件一樣,SQLServer程序也不是很挑剔,只要不和SQLServer數據文件放在同一個磁盤陣列上就行。和操作系統文件一起,我通常將SQLServer程序放在被配置為RAID1鏡像的C盤。

如果你在配置SQLServer7.0的群集,那麼SQLServer程序不能安裝在C盤,必須安裝在共享磁盤陣列上。不幸的是這經常和SQLServer 的數據文件是同一個磁盤陣列,除非你有足夠的錢僅僅為提升SQLServer程序性能而購買一個獨立的獨立磁盤陣列。當性能被與數據庫文件在同一磁盤陣列上的SQLServer程序輕微影響時,獲得容錯能力也是一個不太壞的折中方案。另一方面,升級到SQLServer2000群集是一個不錯的選擇。如果你在配置SQLServer2000群集,那麼SQLServer程序必須放在本地磁盤上,而不是共享磁盤陣列上,所以性能不成問題。

虛擬內存

如果你有一台SQLServer的專用服務器,並且SQLServer的內存設置為動態(缺省),那麼虛擬內存將很少用到。這是因為SQLServer通常不會太多的使用它。因此,虛擬內存放在任何一個特定的位置不是關鍵,除了不要放在SQLServer數據文件的同一磁盤陣列上。

通常,我把虛擬內存放在操作系統和SQLServer程序的同一磁盤陣列上,正如我前面所述,它是一個支持RAID1、RAID5、RAID10的磁盤陣列,通常是C盤,這使管理員更容易管理。

如果不是SQLServer專用服務器,除了SQLServer外還運行了其他程序,由於其他程序的原因,虛擬內存可能會有問題,為了獲得更好的性能,你需要考慮將虛擬內存配置到一個專用的列上。然而,更好的方法是使用一台SQLServer的專用服務器。

tempdb數據庫

如果tempdb數據庫的使用比較繁重,為了提高磁盤I/O性能,考慮將它移到一個RAID1或者RAID10的獨立磁盤陣列上。不要使用RAID5,因為對於寫操作是慢的,如使用,會對tempdb產生副作用。如果不能提供獨立的磁盤陣列,你有不想將它與數據庫文件放在同一個磁盤陣列上,可以考慮放在操作系統的那個磁盤上,這將幫助減少I/O的爭奪以提高性能。

如果應用程序非常多的使用tempdb數據庫,從而引起文件增長超過它的缺省大小,那麼你需要將tempdb的缺省大小增加到最近你的應用程序實際使用的 tempdb的大小。這是因為每次SQLServer服務重新啟動後,tempdb文件都會按照缺省值重建。當tempdb增長時會花費一些性能資源。通過在SQLServer重新啟動時給tempdb分配一個合適的大小,你不必擔心在使用時超過這個大小了。

另外,在tempdb數據庫裡繁重的操作會降低應用程序的性能。尤其是在創建一個或多個大的臨時表去查詢或者做聯接時。為了加速這些查詢,確信tempdb 數據庫的AUTOSTATS(自動更新統計信息)選項已打開,並且在這些臨時表上創建一個或多個索引。大多數情況下,你將發現這能充分加速你的應用程序。但象許多性能建議一樣,測試看看是否有實際的幫助。 

系統數據庫

系統數據庫(master、msdb、model)沒有大量的讀寫操作,所以把它們和你的SQLServer數據文件放在同一磁盤陣列上通常也沒有性能問題。僅僅一種情況除外,就是有成百上千用戶的大數據庫。這種情況下,把系統數據庫放在一個獨立的磁盤陣列上以稍微提高I/O性能。 

用戶數據庫 

為了最佳性能,用戶數據庫文件放在它們自己的磁盤陣列上(RAID1、5或10),和所以的其他數據庫文件,包括日志文件分開。如果再同一個SQLServer上有多個大數據庫的話,考慮為每一個數據庫文件分配一個獨立的磁盤陣列以減少I/O爭奪。 

日志文件

理想地,每一個日志文件都應該有它自己獨立的磁盤陣列(RAID1或10,注意RAID5會降低事務日志寫操作的性能,低於你的預期)。原因是大多數時候,事務日志在連續的寫操作,如果磁盤陣列能連續的寫數據的話(不必中斷去進行其他的讀寫操作),那麼連續寫會很快。但是如果你的磁盤陣列不能連續的寫的話,由於它不得不隨機的執行其他讀寫操作,連續寫就得不到執行,性能就降低了。

當然,為每一個日志文件提供一個獨立的磁盤陣列是很昂貴的。那麼至少將所有的日志文件放在一個磁盤陣列上(RAID1或RAID10),而不要與數據庫文件放在一個磁盤陣列上。連續的寫性能盡管沒有為每個日志文件提供一個獨立的磁盤陣列那樣好,它仍然比試圖與數據庫文件一起競爭磁盤I/O的性能好的多。 

服務器上磁盤控制器的數量

單個的磁盤控制器,不論它是SCSI還是fibre,都有一個最大的吞吐量的限制。因此,你需要讓磁盤控制器的數量與你期望的數據吞吐量相匹配。每個控制器都是不同的,我無法推薦一個明確的解決方案,但最少應該有2個磁盤控制器。一個用於非硬盤設備如CD-ROM、備份設備等等。另一個用於硬盤。目的是不要將快的和慢的設備放在同一個控制器上。

經常使用的一個較好的方案是:一個控制器為非硬盤設備,一個為RAID1的本地硬盤,第三個(有時更多)用於存放數據庫文件和日志文件的磁盤陣列。確保不要為控制器捆綁超過它能處理的更多的磁盤,那樣當它工作的時候,會降低性能。 

服務器上磁盤控制器的類型

總是盡可能的購買最快的磁盤控制器,如果你想要最好的SQLServer性能的話。也許你知道,不同的磁盤控制器有不同的性能特征。例如,對於SCSI類型來說,就有Wide SCSI, Narrow SCSI, Ultra SCSI等不同的類型。光纖連接在更小的層次上,也和上述一樣,不同的磁盤控制器有不同的性能特點。

由於控制器的種類很多,我不能做任何明確的建議。通常硬件廠商會提供不同的模型供選擇。逐一咨詢各自的利弊,選擇最適合你的那一款。 

服務器上磁盤控制器的緩存大小

當你購買磁盤控制器的時候,也要考慮它緩存的大小。一些磁盤控制器允許添加額外的磁盤緩存。通常你要購買的磁盤緩存應和控制器能容納

的緩存一樣多。SQLServer對I/O是非常強烈的,所以去做任何可以提高I/O性能的事,象購買一個大的磁盤緩存,將幫助很大的改善性能。   

磁盤控制器上的寫回緩存是開還是關?

磁盤控制器上的磁盤緩存提供兩個方法去加速訪問。一個是為了讀,一個是為了寫。這其中最重要的是讀,這是大多數SQLServer數據庫花費磁盤I/O時間的地方。另一方面,一個寫回緩存是用來加速寫操作的,而寫相對於讀來說通常不是很多。不幸的是,大多數情況下,SQLServer采取寫回緩存不打開,因此,寫回緩存在大多數磁盤控制器上是被關掉的。如果你不那樣,在一定環境下,在SQLServer寫數據後(一旦它寫完數據,它就會認為是正確地寫的),可能會取得一些髒數據,但是由於某些原因(例如電力不夠),寫回緩存不會把數據寫到磁盤上。

一些控制器提供了備份電池以防止這樣的問題,但它們不總是能如預期的那樣工作。個人認為,寧願要正確的數據雖然寫慢一點,也不要錯誤

的數據,盡管那樣寫更快。 換句話說,我建議你關掉磁盤控制器上的寫回緩存,雖然那樣會對寫性能有一些非常小的影響。 

磁盤轉速

磁盤陣列裡的磁盤有不同的轉速。 正如你所想,為了最佳的性能,總是購買最快的磁盤。通常是15000轉或更快。另外,不要將不同轉速的磁盤放在同一個磁盤陣列裡,那樣會影響性能。 

服務器上的網卡數量是多少?

幸運的是, 網絡流量通常不會稱為SQLServer的瓶頸。單個網卡總是足夠用。但是如果你發現網絡流量成問題了(你已經有成百上千個用戶),那麼添加多個網卡總是正確的,這能提高性能。另外,兩個或者更多的網卡能增加冗余,減少宕機時間。

網卡速度是多少?

至少應使用100M的網卡,10M的不能滿足你需要的帶寬。如果一個或者更多的100M的網卡不能滿足,考慮用G級的網卡。事實上,你可能需要完全地跳過 100M的網卡而僅僅用G級的網卡代替。使用更快的網卡不會增加網絡流量,它僅僅允許更多的流量通過,輪流的允許你的服務器在適宜的性能下運行。 

網卡硬編碼是Speed/Duplex的嗎?

如果你的SQLServer有兩個10/100或者10/100/1000的網卡,假定是自動識別網卡速度並設置為適合的,別相信那個能正常的工作。網卡通常不能正確的自識別,總是設置一個小於最佳速度的值或者duplex設置,這樣會影響網絡性能。你需要做的是手工設置卡的速度和duplex設置,以便你能確認它已經正確的設置了。 

網卡是連在交換機上的嗎?

在一個大的數據中心這是顯而易見的,但是對於小的機構來說,使用一個Hub來連接服務器。要是那樣,請認真考慮用適當的交換機替換掉Hub,用可能最高的性能去配置交換機,例如100M並且全雙工通信。將Hub替換為交換機後在網絡性能上會有一個戲劇性的不同。 

所有硬件的驅動都是最新的嗎?

誠然,這是一個煩人的話題,但它比你認為的更重要。最大的性能消耗之一是有Bug的驅動(會引起一些奇怪的不常見的問題),無論它們是在磁盤控制器中還是網卡中,或者別的地方。通過使用最新的驅動,你有可能得到更好更快的性能的驅動,從而提高SQLServer的性能。

你應該定期的檢查你的硬件是否有新的驅動可用,當你有時間的時候去安裝它們。我本人曾經將一個老的有很多bug的驅動更新後是性能得到了徹底的根本提升。 

SQLServer服務器是專用的嗎?

前面我間接提到過,SQLServer應該運行在一個專用的服務器上,而不是和其他應用程序、軟件共享一個服務器。當你將SQLServer和其他軟件共享時,你迫使SQLServer去爭取物理資源,這樣調優SQLServer性能就更加困難。有很多次我在查找SQLServer性能低下的原因時都發現是另一個和SQLServer運行在同一台服務器上的應用程序的緣故。

-
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved