① 什麼叫虛擬存儲器怎麼樣確定虛擬存儲器的容量
隨著圍繞數字化、網路化開展的各種多媒體處理業務的不斷增加,存儲系統網路平台已經成為一個核心平台,同時各種應用對平台的要求也越來越高,不光是在存儲容量上,還包括數據訪問性能、數據傳輸性能、數據管理能力、存儲擴展能力等等多個方面。可以說,存儲網路平台的綜合性能的優劣,將直接影響到整個系統的正常運行。
為達到這些要求,一種新興的技術正越來越受到大家的關注,即虛擬存儲技術。
其實虛擬化技術並不是一件很新的技術,它的發展,應該說是隨著計算機技術的發展而發展起來的,最早是始於70年代。由於當時的存儲容量,特別是內存容量成本非常高、容量也很小,對於大型應用程序或多程序應用就受到了很大的限制。為了克服這樣的限制,人們就採用了虛擬存儲的技術,最典型的應用就是虛擬內存技術。隨著計算機技術以及相關信息處理技術的不斷發展,人們對存儲的需求越來越大。這樣的需求刺激了各種新技術的出現,比如磁碟性能越來越好、容量越來越大。但是在大量的大中型信息處理系統中,單個磁碟是不能滿足需要,這樣的情況下存儲虛擬化技術就發展起來了。在這個發展過程中也由幾個階段和幾種應用。首先是磁碟條帶集(RAID,可帶容錯)技術,將多個物理磁碟通過一定的邏輯關系集合起來,成為一個大容量的虛擬磁碟。而隨著數據量不斷增加和對數據可用性要求的不斷提高,又一種新的存儲技術應運而生,那就是存儲區域網路(SAN)技術。SAN的廣域化則旨在將存儲設備實現成為一種公用設施,任何人員、任何主機都可以隨時隨地獲取各自想要的數據。目前討論比較多的包括iSCSI、FC Over IP 等技術,由於一些相關的標准還沒有最終確定,但是存儲設備公用化、存儲網路廣域化是一個不可逆轉的潮流。
一、虛擬存儲的概念
所謂虛擬存儲,就是把多個存儲介質模塊(如硬碟、RAID)通過一定的手段集中管理起來,所有的存儲模塊在一個存儲池(Storage Pool)中得到統一管理,從主機和工作站的角度,看到就不是多個硬碟,而是一個分區或者卷,就好象是一個超大容量(如1T以上)的硬碟。這種可以將多種、多個存儲設備統一管理起來,為使用者提供大容量、高數據傳輸性能的存儲系統,就稱之為虛擬存儲。
二、虛擬存儲的分類
目前虛擬存儲的發展尚無統一標准,從虛擬化存儲的拓撲結構來講主要有兩種方式:即對稱式與非對稱式。對稱式虛擬存儲技術是指虛擬存儲控制設備與存儲軟體系統、交換設備集成為一個整體,內嵌在網路數據傳輸路徑中;非對稱式虛擬存儲技術是指虛擬存儲控制設備獨立於數據傳輸路徑之外。從虛擬化存儲的實現原理來講也有兩種方式;即數據塊虛擬與虛擬文件系統。具體如下:
1.對稱式虛擬存儲
圖1對稱式虛擬存儲解決方案的示意圖
在圖1所示的對稱式虛擬存儲結構圖中,存儲控制設備 High Speed Traffic Directors(HSTD)與存儲池子系統Storage Pool集成在一起,組成SAN Appliance。可以看到在該方案中存儲控制設備HSTD在主機與存儲池數據交換的過程中起到核心作用。該方案的虛擬存儲過程是這樣的:由HSTD內嵌的存儲管理系統將存儲池中的物理硬碟虛擬為邏輯存儲單元(LUN),並進行埠映射(指定某一個LUN能被哪些埠所見),主機端將各可見的存儲單元映射為操作系統可識別的盤符。當主機向SAN Appliance寫入數據時,用戶只需要將數據寫入位置指定為自己映射的盤符(LUN),數據經過HSTD的高速並行埠,先寫入高速緩存,HSTD中的存儲管理系統自動完成目標位置由LUN到物理硬碟的轉換,在此過程中用戶見到的只是虛擬邏輯單元,而不關心每個LUN的具體物理組織結構。該方案具有以下主要特點:
(1)採用大容量高速緩存,顯著提高數據傳輸速度。
緩存是存儲系統中廣泛採用的位於主機與存儲設備之間的I/O路徑上的中間介質。當主機從存儲設備中讀取數據時,會把與當前數據存儲位置相連的數據讀到緩存中,並把多次調用的數據保留在緩存中;當主機讀數據時,在很大幾率上能夠從緩存中找到所需要的數據。直接從緩存上讀出。而從緩存讀取數據時的速度只受到電信號傳播速度的影響(等於光速),因此大大高於從硬碟讀數據時碟片機械轉動的速度。當主機向存儲設備寫入數據時,先把數據寫入緩存中,待主機端寫入動作停止,再從緩存中將數據寫入硬碟,同樣高於直接寫入硬碟的速度
(2)多埠並行技術,消除了I/O瓶頸。
傳統的FC存儲設備中控制埠與邏輯盤之間是固定關系,訪問一塊硬碟只能通過控制它的控制器埠。在對稱式虛擬存儲設備中,SAN Appliance的存儲埠與LUN的關系是虛擬的,也就是說多台主機可以通過多個存儲埠(最多8個)並發訪問同一個LUN;在光纖通道100MB/帶寬的大前提下,並行工作的埠數量越多,數據帶寬就越高。
(3)邏輯存儲單元提供了高速的磁碟訪問速度。
在視頻應用環境中,應用程序讀寫數據時以固定大小的數據塊為單位(從512byte到1MB之間)。而存儲系統為了保證應用程序的帶寬需求,往往設計為傳輸512byte以上的數據塊大小時才能達到其最佳I/O性能。在傳統SAN結構中,當容量需求增大時,唯一的解決辦法是多塊磁碟(物理或邏輯的)綁定為帶區集,實現大容量LUN。在對稱式虛擬存儲系統中,為主機提供真正的超大容量、高性能LUN,而不是用帶區集方式實現的性能較差的邏輯卷。與帶區集相比,Power LUN具有很多優勢,如大塊的I/O block會真正被存儲系統所接受,有效提高數據傳輸速度;並且由於沒有帶區集的處理過程,主機CPU可以解除很大負擔,提高了主機的性能。
(4)成對的HSTD系統的容錯性能。
在對稱式虛擬存儲系統中,HSTD是數據I/O的必經之地,存儲池是數據存放地。由於存儲池中的數據具有容錯機制保障安全,因此用戶自然會想到HSTD是否有容錯保護。象許多大型存儲系統一樣,在成熟的對稱式虛擬存儲系統中,HSTD是成對配製的,每對HSTD之間是通過SAN Appliance內嵌的網路管理服務實現緩存數據一致和相互通信的。
(5)在SAN Appliance之上可方便的連接交換設備,實現超大規模Fabric結構的SAN。
因為系統保持了標準的SAN結構,為系統的擴展和互連提供了技術保障,所以在SAN Appliance之上可方便的連接交換設備,實現超大規模Fabric結構的SAN。
2.非對稱式虛擬存儲系統
圖2非對稱式虛擬存儲系統示意圖
在圖2所示的非對稱式虛擬存儲系統結構圖中,網路中的每一台主機和虛擬存儲管理設備均連接到磁碟陣列,其中主機的數據路徑通過FC交換設備到達磁碟陣列;虛擬存儲設備對網路上連接的磁碟陣列進行虛擬化操作,將各存儲陣列中的LUN虛擬為邏輯帶區集(Strip),並對網路上的每一台主機指定對每一個Strip的訪問許可權(可寫、可讀、禁止訪問)。當主機要訪問某個Strip時,首先要訪問虛擬存儲設備,讀取Strip信息和訪問許可權,然後再通過交換設備訪問實際的Strip中的數據。在此過程中,主機只會識別到邏輯的Strip,而不會直接識別到物理硬碟。這種方案具有如下特點:
(1)將不同物理硬碟陣列中的容量進行邏輯組合,實現虛擬的帶區集,將多個陣列控制器埠綁定,在一定程度上提高了系統的可用帶寬。
(2)在交換機埠數量足夠的情況下,可在一個網路內安裝兩台虛擬存儲設備,實現Strip信息和訪問許可權的冗餘。
但是該方案存在如下一些不足:
(1)該方案本質上是帶區集——磁碟陣列結構,一旦帶區集中的某個磁碟陣列控制器損壞,或者這個陣列到交換機路徑上的銅纜、GBIC損壞,都會導致一個虛擬的LUN離線,而帶區集本身是沒有容錯能力的,一個LUN的損壞就意味著整個Strip裡面數據的丟失。
(2)由於該方案的帶寬提高是通過陣列埠綁定來實現的,而普通光纖通道陣列控制器的有效帶寬僅在40MB/S左右,因此要達到幾百兆的帶寬就意味著要調用十幾台陣列,這樣就會佔用幾十個交換機埠,在只有一兩台交換機的中小型網路中,這是不可實現的。
(3)由於各種品牌、型號的磁碟陣列其性能不完全相同,如果出於虛擬化的目的將不同品牌、型號的陣列進行綁定,會帶來一個問題:即數據寫入或讀出時各並發數據流的速度不同,這就意味著原來的數據包順序在傳輸完畢後被打亂,系統需要佔用時間和資源去重新進行數據包排序整理,這會嚴重影響系統性能。
3.數據塊虛擬與虛擬文件系統
以上從拓撲結構角度分析了對稱式與非對稱式虛擬存儲方案的異同,實際從虛擬化存儲的實現原理來講也有兩種方式;即數據塊虛擬與虛擬文件系統。
數據塊虛擬存儲方案著重解決數據傳輸過程中的沖突和延時問題。在多交換機組成的大型Fabric結構的SAN中,由於多台主機通過多個交換機埠訪問存儲設備,延時和數據塊沖突問題非常嚴重。數據塊虛擬存儲方案利用虛擬的多埠並行技術,為多台客戶機提供了極高的帶寬,最大限度上減少了延時與沖突的發生,在實際應用中,數據塊虛擬存儲方案以對稱式拓撲結構為表現形式。
虛擬文件系統存儲方案著重解決大規模網路中文件共享的安全機制問題。通過對不同的站點指定不同的訪問許可權,保證網路文件的安全。在實際應用中,虛擬文件系統存儲方案以非對稱式拓撲結構為表現形式。
三、虛擬存儲技術的實現方式
目前實現虛擬存儲主要分為如下幾種:
1.在伺服器端的虛擬存儲
伺服器廠商會在伺服器端實施虛擬存儲。同樣,軟體廠商也會在伺服器平台上實施虛擬存儲。這些虛擬存儲的實施都是通過伺服器端將鏡像映射到外圍存儲設備上,除了分配數據外,對外圍存儲設備沒有任何控制。伺服器端一般是通過邏輯卷管理來實現虛擬存儲技術。邏輯卷管理為從物理存儲映射到邏輯上的卷提供了一個虛擬層。伺服器只需要處理邏輯卷,而不用管理存儲設備的物理參數。
用這種構建虛擬存儲系統,伺服器端是一性能瓶頸,因此在多媒體處理領域幾乎很少採用。
2.在存儲子系統端的虛擬存儲
另一種實施虛擬的地方是存儲設備本身。這種虛擬存儲一般是存儲廠商實施的,但是很可能使用廠商獨家的存儲產品。為避免這種不兼容性,廠商也許會和伺服器、軟體或網路廠商進行合作。當虛擬存儲實施在設備端時,邏輯(虛擬)環境和物理設備同在一個控制范圍中,這樣做的益處在於:虛擬磁碟高度有效地使用磁碟容量,虛擬磁帶高度有效地使用磁帶介質。
在存儲子系統端的虛擬存儲設備主要通過大規模的RAID子系統和多個I/O通道連接到伺服器上,智能控制器提供LUN訪問控制、緩存和其他如數據復制等的管理功能。這種方式的優點在於存儲設備管理員對設備有完全的控制權,而且通過與伺服器系統分開,可以將存儲的管理與多種伺服器操作系統隔離,並且可以很容易地調整硬體參數。
3.網路設備端實施虛擬存儲
網路廠商會在網路設備端實施虛擬存儲,通過網路將邏輯鏡像映射到外圍存儲設備,除了分配數據外,對外圍存儲設備沒有任何控制。在網路端實施虛擬存儲具有其合理性,因為它的實施既不是在伺服器端,也不是在存儲設備端,而是介於兩個環境之間,可能是最「開放」的虛擬實施環境,最有可能支持任何的伺服器、操作系統、應用和存儲設備。從技術上講,在網路端實施虛擬存儲的結構形式有以下兩種:即對稱式與非對稱式虛擬存儲。
從目前的虛擬存儲技術和產品的實際情況來看,基於主機和基於存儲的方法對於初期的採用者來說魅力最大,因為他們不需要任何附加硬體,但對於異構存儲系統和操作系統而言,系統的運行效果並不是很好。基於互聯設備的方法處於兩者之間,它迴避了一些安全性問題,存儲虛擬化的功能較強,能減輕單一主機的負載,同時可獲得很好的可擴充性。
不管採用何種虛擬存儲技術,其目的都使為了提供一個高性能、安全、穩定、可靠、可擴展的存儲網路平台,滿足節目製作網路系統的苛刻要求。根據綜合的性能價格比來說,一般情況下,在基於主機和基於存儲設備的虛擬存儲技術能夠保證系統的數據處理能力要求時,優先考慮,因為這兩種虛擬存儲技術構架方便、管理簡單、維護容易、產品相對成熟、性能價格比高。在單純的基於存儲設備的虛擬存儲技術無法保證存儲系統性能要求的情況下,我們可以考慮採用基於互連設備的虛擬存儲技術。
四、虛擬存儲的特點
虛擬存儲具有如下特點:
(1)虛擬存儲提供了一個大容量存儲系統集中管理的手段,由網路中的一個環節(如伺服器)進行統一管理,避免了由於存儲設備擴充所帶來的管理方面的麻煩。例如,使用一般存儲系統,當增加新的存儲設備時,整個系統(包括網路中的諸多用戶設備)都需要重新進行繁瑣的配置工作,才可以使這個「新成員」加入到存儲系統之中。而使用虛擬存儲技術,增加新的存儲設備時,只需要網路管理員對存儲系統進行較為簡單的系統配置更改,客戶端無需任何操作,感覺上只是存儲系統的容量增大了。
(2)虛擬存儲對於視頻網路系統最有價值的特點是:可以大大提高存儲系統整體訪問帶寬。存儲系統是由多個存儲模塊組成,而虛擬存儲系統可以很好地進行負載平衡,把每一次數據訪問所需的帶寬合理地分配到各個存儲模塊上,這樣系統的整體訪問帶寬就增大了。例如,一個存儲系統中有4個存儲模塊,每一個存儲模塊的訪問帶寬為50MBps,則這個存儲系統的總訪問帶寬就可以接近各存儲模塊帶寬之和,即200MBps。
(3)虛擬存儲技術為存儲資源管理提供了更好的靈活性,可以將不同類型的存儲設備集中管理使用,保障了用戶以往購買的存儲設備的投資。
(4)虛擬存儲技術可以通過管理軟體,為網路系統提供一些其它有用功能,如無需伺服器的遠程鏡像、數據快照(Snapshot)等。
五、虛擬存儲的應用 由於虛擬存儲具有上述特點,虛擬存儲技術正逐步成為共享存儲管理的主流技術,其應用具體如下:
1.數據鏡像
數據鏡像就是通過雙向同步或單向同步模式在不同的存儲設備間建立數據復本。一個合理的解決方案應該能在不依靠設備生產商及操作系統支持的情況下,提供在同一存儲陣列及不同存儲陣列間製作鏡像的方法。
2.數據復制
通過IP地址實現的遠距離數據遷移(通常為非同步傳輸)對於不同規模的企業來說,都是一種極為重要的數據災難恢復工具。好的解決方案不應當依賴特殊的網路設備支持,同時,也不應當依賴主機,以節省企業的管理費用。
3.磁帶備份增強設備
過去的幾年,在磁帶備份技術上鮮有新發展。盡管如此,一個網路存儲設備平台亦應能在磁帶和磁碟間搭建橋路,以高速、平穩、安全地完成備份工作。
4.實時復本
出於測試、拓展及匯總或一些別的原因,企業經常需要製作數據復本。
5.實時數據恢復
利用磁帶來還原數據是數據恢復工作的主要手段,但常常難以成功。數據管理工作其中一個重要的發展新方向是將近期內的備分數據(可以是數星期前的歷史數據)轉移到磁碟介質,而非磁帶介質。用磁碟恢復數據就象閃電般迅速(所有文件能在60秒內恢復),並遠比用磁帶恢復數據安全可靠。同時,整卷(Volume)數據都能被恢復。
6.應用整合
存儲管理發展的又一新方向是,將服務貼近應用。沒有一個信息技術領域的管理人員會單純出於對存儲設備的興趣而去購買它。存儲設備是用來服務於應用的,比如資料庫,通訊系統等等。通過將存儲設備和關鍵的企業應用行為相整合,能夠獲取更大的價值,同時,大大減少操作過程中遇到的難題。
7.虛擬存儲在數字視頻網路中的應用
現在我著重介紹虛擬存儲在數字視頻網路中的應用。
數字視頻網路對廣播電視行業來說已經不是一個陌生的概念了,由於它在廣播電視技術數字化進程中起到了重要的作用,國內各級電視台對其給予極大的關注,並且開始構造和應用這類系統,在數字視頻網的概念中完全打破了以往一台錄象機、一個編輯系統、一套播出系統的傳統結構,而代之以上載工作站、編輯製作工作站、播出工作站及節目存儲工作站的流程,便於操作和管理。節目上載、節目編輯、節目播出在不同功能的工作站上完成,可成倍提高工作效率。同時,由於採用非線性編輯系統,除了採集時的壓縮損失外。信號在製作、播出過程中不再有任何損失,節目的技術質量將大大提高。
在現有的視頻網路系統中,雖然電腦的主頻、網路的傳輸速率以及交換設備的性能,已經可以滿足絕大多數應用的要求,但其中存儲設備的訪問帶寬問題成為了系統的一個主要性能瓶頸。視頻編輯、製作具有數據量存儲大、碼流高、實時性強、安全性重要等特點。這就要求應用於視頻領域的存儲技術和產品必須具有足夠的帶寬並且穩定性要好。
在單機應用時,為了保證一台編輯站點有足夠的數據帶寬,SCSI技術、本地獨立磁碟冗餘陣例RAID(Rendant Array of Independent Disks)技術(包括軟體和硬體)被廣泛應用,它通過把若干個SCSI硬碟加上控制器組成一個大容量,快速響應,高可靠性的存儲子系統,從用戶看可作為一個邏輯盤或者虛擬盤,從而大大提高了數據傳輸率和存儲容量,同時利用糾錯技術提高了存儲的可靠性,並可滿足帶寬要求。
隨著節目製作需求的發展,要求2—3台站點共享編輯數據。這時可利用SCSI網路技術實現這一要求。幾台編輯站點均配置高性能的SCSI適配器,連接至共享的SCSI磁碟陣列,既可以實現幾個站點共享數據,又可以保證每一台單機的工作帶寬。
光纖通道技術的成熟應用對視頻網路的發展具有里程碑的意義,從此主機與共享存儲設備之間的連接距離限制從幾米、十幾米,擴展到幾百米、幾千米,再配合光纖通道交換設備,網路規模得到幾倍、十幾倍的擴充。這時候的FC(Fibre Channel光纖通道)磁碟陣列——RAID容錯技術、相對SCSI的高帶寬、大容量,成為視頻網路中的核心存儲設備。
隨著電視台規模的發展,全台級大規模視頻網路的應用被提出。在這種需求下,就必須將更先進的存儲技術與產品引入視頻領域。存儲區域網(SAN)的發展目前正處於全速上升期,各種概念層出不窮。其中具有劃時代意義的是虛擬存儲概念的提出。相對於傳統的交換機加RAID陣列,主機通過硬體層直接訪問陣列中的硬碟的SAN結構,虛擬存儲的定位是將數據存儲功能從實際的、物理的數據存取過程中抽象出來,使普通用戶在訪問數據時不必關心具體的存儲設備的配置參數、物理位置及容量,從而簡化用戶和系統管理人員的工作難度。
在設計一個視頻網路系統的時候,對存儲系統的選用,主要考慮如下幾個因素:(1)總體帶寬性能;(2)可管理性;(3)安全性;(4)可擴展性;(5)系統成本。
當然,這些因素之間有時是相互制約的,特別是系統成本與性能和安全性的關系。如何在這些因素之間尋求合理的、實用的、經濟的配合,是一個需要解決的課題。虛擬存儲技術的出現,為我們在構建視頻網路系統時提供了一個切實可行的高性能價格比的解決方案。
從拓撲結構來講,對稱式的方案具有更高的帶寬性能,更好的安全特性,因此比較適合大規模視頻網路應用。非對稱式方案由於採用了虛擬文件原理,因此更適合普通區域網(如辦公網)的應用。
② 怎樣提高IIS伺服器性能,加快伺服器速度
1、應該分配和釋放多個對象
你應該盡量避免過量分配內存,因為內存分配可能是代價高昂的。釋放內存塊可能更昂貴,因為大多數分配算符總是企圖連接臨近的已釋放的內存塊成為更大的塊。直到Windows NT? 4.0 service pack 4.0,在多線程處理中,系統堆通常都運行得很糟。堆被一個全局鎖保護,並且在多處理器系統上是不可擴展的。
2.不應該考慮使用處理器高速緩存
大多數人都知道由虛擬內存子系統導致的hard 頁錯誤代價很高,最好避免。但是許多人認為其他內存訪問方法沒有什麼區別。自從80486以後,這一觀點就不對了。現代的CPUs比RAM要快得多,RAM至少需要兩級內存緩存 ,高速L1 緩存能保存8KB數據和8KB指令,而較慢的L2 緩存能保存幾百KB的數據和代碼,這些數據和代碼混合在一起。L1 緩存中內存區域的一個引用需要一個時鍾周期,L2 緩存的引用需要4到7個時鍾周期,而主內存的引用需要許多個處理器時鍾周期。後一數字不久將會超過100個時鍾周期。在許多方面,緩存像一個小型的,高速的,虛擬內存系統。
至於和緩存有關的基本內存單元不是位元組而是緩存列。Pentium 緩存列有32個位元組寬。Alpha 緩存列有64個位元組寬。這意味著在L1 緩存中只有512個slot給代碼和數據。如果多個數據一起使用(時間位置)而並不存儲在一起(空間位置),性能會很差。數組的空間位置很好,而相互連接的列表和其他基於指針的數據結構的位置往往很差。
把數據打包到同一個緩存列中通常會有利於提高性能,但是它也會破壞多處理器系統的性能。內存子系統很難協調處理器間的緩存。如果一個被所有處理器使用的只讀數據,和一個由一個處理器使用並頻繁更新的數據共享一個緩存 列,那麼緩存將會花費很長時間更新這個緩存列的拷貝。這個Ping-Pong高速游戲通常被稱為"緩存 sloshing"。如果只讀數據在一個不同的緩存 列中,就可以避免sloshing。
對代碼進行空間優化比進行速度優化效率更高。代碼越少,代碼所佔的頁也越少,這樣需要的運行設置和產生的頁錯誤也會更少,同時占據的緩存 列也會更少。然而,某些核心函數應該進行速度優化。可以利用profiler去識別這些函數。
3.決不要緩存頻繁使用的數據。
軟體緩存可以被各種應用程序使用。當一個計算代價很高時,你會保存結果的一個拷貝。這是一個典型的時空折中方法:犧牲一些存儲空間以節省時間。如果做得好,這種方法可能非常有效。
你必須正確地進行緩存。如果緩存了錯誤數據,就會浪費存儲空間。如果緩存得太多,其他操作可以使用的內存將會很少。如果緩存得太少,效率又會很低,因為你必須重新計算被緩存 遺漏的數據。如果將時間敏感數據緩存得時間過長,這些數據將會過時。一般,伺服器更關心的是速度而不是空間,所以他們要比桌面系統進行更多的緩存。一定要定期去除不用的緩存,否則將會有運行設置問題。
4.應該創建多個線程,越多越好。
調整伺服器中起作用的線程數目是很重要的。如果線程是I/O-bound的,將會花費很多時間用來等待I/O的完成-一個被阻塞的線程就是一個不做任何有用工作的線程。加入額外的線程可以增加通量,但是加入過多的線程將會降低伺服器的性能,因為上下文交換將會成為一個重大的overhead。上下文交換速度應該低的原因有三個:上下文交換是單純的overhead,對應用程序的工作沒有任何益處;上下文交換用盡了寶貴的時鍾周期;最糟的是,上下文交換將處理器的緩存填滿了沒用的數據,替換這些數據是代價高昂的。
有很多事情是依靠你的線程化結構的。每個客戶端一個線程是絕對不合適的。因為對於大量用戶端,它的擴展性不好。上下文交換變得難以忍受,Windows NT用盡了資源。線程池模型會工作得更好,在這種方法中一個工人線程池將處理一條請求列,因為Windows 2000提供了相應的APIs,如QueueUserWorkItem。
5.應該對數據結構使用全局鎖
使數據線程安全的最簡單方法是把它套上一把大鎖。為簡單起見,所有的東西都用同一把鎖。這種方法會有一個問題:序列化。為了得到鎖,每一個要處理數據的線程都必須排隊等候。如果線程被一把鎖阻塞,它沒有在做任何有用的事。當伺服器的負載較輕時,這個問題並不常見,因為一次可能只有一個線程需要鎖。在負載很重的情況下,對鎖的激烈爭奪可能就會成為一個大問題。
設想在多車道高速公路上發生了一個意外事故,這條高速公路上的所有車輛都被轉向一條狹窄的道路。如果車輛很少,這一轉換對交通流的速率的影響可以忽略。如果車輛很多,當車輛慢慢並入那條單通道時,交通阻塞會延伸幾英里。
有幾種技術能夠減少鎖競爭。
· 不要過分保護,也就是說,不是非常必要不要鎖住數據。只有需要時才去持有鎖,而且時間不要過長。不要在大段代碼周圍或頻繁執行的代碼中沒必要地使用鎖,這一點很重要。
· 對數據進行分割,使它能夠用一套獨立的鎖保護。例如,一個符號表可以按標識符的第一個字母分割,這樣在修改名字以Q開頭的符號的值時,就不會去讀名字以H開頭的符號的值。
· 使用APIs的Interlocked 系列(InterlockedIncrement,等)自動修改數據而不需要鎖。
· 當數據不是經常被修改時可以使用多讀者/單作者(multi-reader/single-writer)鎖。你將獲得更好的並發性,盡管鎖操作的代價將更高並且你可能會冒餓死作者的危險。
· 在關鍵部分使用循環計數器。參見Windows NT 4.0 service pack 3中的SetCriticalSectionSpinCount API。
· 如果你不能得到鎖,使用TryEnterCriticalSection並做一些其他的有用的工作。
高競爭導致serialization,serialization導致降低CPU的利用率,這促使用戶加入更多的線程,結果事情變得更糟。
6.不必注意多處理器機器
你的代碼在多處理器系統上比在單處理器系統上運行得還要糟,這可能是件令人惡心的事。一個很自然的想法是,在一個N維系統上運行N次會更好。性能很差的原因是競爭:鎖競爭,匯流排競爭,和/或緩存列競爭。處理器都在是爭奪共享資源的所有權,而不是做更多的工作。
如果你一定要編寫多線程應用程序的話,你應該在多處理器盒上對你的應用程序進行強度測試和性能測試。單處理器系統通過時間分片地執行線程而提供一個並發性的假象。多處理器盒具有真正的並發性,競爭環境和競爭更容易發生。
7.應該始終使用模塊化調用;他們很有趣。
利用同步模塊化調用來執行I/O操作對大多數桌面應用程序來說是合適的。但是,他們不是使用伺服器上的CPU(s)的好方法。I/O操作要花費上百萬個時鍾周期來完成,這些時鍾周期本來可以被更好地利用。利用非同步I/O你能得到顯著提高的用戶請求率和I/O通量,不過增加了額外的復雜性。
如果你有需要花費很長時間的模塊化調用或I/O操作,你應該考調撥多少資源給他們。你想使用所有的線程還是有個限制?一般地,使用有限的幾個線程要好些。構建一個小的線程池和隊列,利用隊列來安排線程的工作完成模塊化調用。這樣,其他線程就可以拾取和處理你的非模塊化的請求。
8.不要進行測量
當你能夠測量你所談論的事情並用數字表達它時,這就表示你對他有了一定的了解;但是如果你不能用數字表達時,你的知識是貧瘠的不能令人滿意的;這可能是知識的開始,但這時你簡直不可能將你的思想提高到科學的水平。
- Lord Kelvin (William Thomson)
如果不測量你就不能了解應用程序的特性。你在黑暗中摸索,一半是靠猜測。如果不識別性能問題,你就不能做任何改進或做出工作量計劃。
測量包括黑匣子測量和profiling。黑匣子測量的意思是收集由性能計數器(內存使用,上下文交換,CPU利用等)和外部檢測工具(通量,反映時間等)所顯示的數據。為了profile你的代碼,你編譯代碼的一個工具版,然後在各種條件下運行它,並收集關於執行時間和過程調用頻率的統計數據。
測量如果不用於分析的話就一點用都沒有。測量將不僅告訴你有問題,而且甚至能幫助你找到問題發生在哪,但它不能告訴你為什麼會有問題。對問題進行分析以便你能正確地改正他們。要從根本上解決問題而不是停留在表面現象。
當你進行改動後,要重新測量。你要知道你的改動是否有效。改動也可能會暴露其他性能問題,測量-分析-改正-再測量的循環就會重新開始。你也必須要有規律地進行測量,以便發現性能衰退問題。
9.應該使用單一用戶,單一請求的測試方法。
書寫ASP和ISAPI應用程序的一個通病是只用一個瀏覽器去測試應用程序。當他們在Internet上應用他們的程序時,他們才發現他們的應用程序不能處理高負載,並且通量和反應時間另人可憐。
用一個瀏覽器測試是必要的但是不夠的。如果瀏覽器反應得不夠快,你就知道你有麻煩了。但即使它在使用一個瀏覽器時很快,你也不知道它處理負載的能力如何。如果十幾個用戶同時請求會發生什麼事?一百個呢?你的應用程序能容忍什麼樣的通量?它能提供什麼樣的反應時間?在輕載時這些數字會怎樣?中等負載呢?重載呢?在多處理器機器上你的應用程序會如何?對你的應用程序進行強度測試,這對於找出bugs發現性能問題來說是基本的。
類似的負載測試考慮適用於所有的伺服器應用程序。
10.不應使用實際環境。
人們往往只在幾個特定的,人工的環境(如下benchmarks)下調整應用程序。選擇和實際情況相對應的各種情況,並為針對各種操作進行優化,這一點很重要。如果你不這樣做,你的用戶和評論家一定會這樣做,並且他們將依此來評判你的應用程序的好壞。
③ linux 系統mysql 伺服器內存利用率很高了怎麼解決
Linux 進程通過 C 標准庫中的內存分配函數 malloc 向系統申請內存,但是到真正與內核交互之間,其實還隔了一層,即內存分配管理器(memory allocator)。常見的內存分配器包括:ptmalloc(Glibc)、tcmalloc(Google)、jemalloc(FreeBSD)。MySQL 默認使用的是 glibc 的 ptmalloc 作為內存分配器。
目前 jemalloc 應用於 Firefox、FaceBook 等,並且是 MariaDB、Redis、Tengine 默認推薦的內存分配器,而 tcmalloc 則應用於 WebKit、Chrome 等。