SQL Server小知識:Processor Affinity

iDotNetSpace發表於2008-09-19

 

sql server通常都執行在多處理器的伺服器上,這一點在現在尤為普遍。原因是多核心的處理器越來越普及。

  那麼,在多處理器環境下,Windows作業系統(事實上是從2000開始的)通常都會將程式任務放在一個隊伍裡面,然後讓這些處理任務依次去佔有處理器進行計算。

  這樣做的好處就是每個計算任務都可以獲得近似於平均的處理資源,儘管無法保證一個處理任務每次都能拿到同一個處理器。這就像嘉年華我們重複排隊參加一個刺激的專案(比如說自由落體,事實上我從來不參加這種專案),每個人上去一輪,並不能保證每次都能做同一張位置。

  不過回到SQL Server上面來,SQL Server可不喜歡這樣的處理機制。

  大家可能都知道處理器中有個東西叫片內快取,片內快取有1級、2級、3級之分。

  0vJ o9E4\ I?,g3v _8o14943301我們假設處理器要計算A、B、C三個任務,處理器先運算A任務,A任務還沒有結束的時候它的遊戲時間就結束了,因此處理器在接受B的時候會將計算B所需的資料載入到1級片內快取中,而將A任務(我們假設處理器還沒有完成它的計算任務)的資料挪到2級片內快取中,或者3級。

  當那個A任務回來的計算的時候,處理器會從2級片內快取中恢復計算所需的資料,當然這要取決於是不是那些資料還在2級快取中,因為有很多因素可以讓它不在那兒,比如說A任務回來的時候發現接待它的已經不是原來那個處理器了,當然A任務就不能指望面前這個處理器有它的計算資料了(當然計算A任務回到同一顆處理器,也可能因為其他任務佔用了這個處理器的2級片內快取而導致它原來存入的資料被替換掉了)。

  如果處理器發現A任務資料還在2級片內快取中,作業系統就認為這次命中了2級快取,如果不在了,就說這次沒有命中2級快取。因此我們可以知道作業系統是非常渴望每次都命中2級快取的,因為這樣就可以節省不少時間重新從記憶體中將資料載入到片內快取中。

  大多數作業系統要面對的任務都不會有太多的計算資料,因此這些任務不需要太多關心片內快取的問題。同時多數低端的伺服器也沒有很大的片內快取,因此它們也不太關心這個問題。不過對於執行在有較大片內快取的伺服器上的SQL Server來說,這個問題就要嚴肅一些了。

  在中高階的PC伺服器(為什麼說是PC伺服器呢,因為Windows現在還可以執行在一些廠商的小型機平臺上,例如HP的SuperDome)中,通常單個處理器的片內快取都在2M-4M,而且這些伺服器可以擁有8個甚至更多一些的處理器,同時SQL Server的計算任務都是依賴於大量資料的,因此SQL Server的一個任務可不希望它重新拿回處理器的時候發現自己的資料不在了。

  為了解決這個問題,SQL Server就有了這個處理器親和度(Processor Affinity)的配置項,啟用這個選項後,SQL Server中的任務就會記著自己原來在那個處理器上工作的,當它們再次有機會回到處理器工作的時候它們會認準回家的路——只用原來的那顆處理器。(事實上這個過程要複雜一些,有興趣的朋友可以進一步瞭解SQL Server中排程這個概念)。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-450330/,如需轉載,請註明出處,否則將追究法律責任。