Hyperthreading'i devre dışı bırakmak SQL Server yüklememizdeki performansı artıracak mı


28

İlgili: Geçerli SQL Server ve Hyperthreading bilgeliği

Yakın zamanda bir bizim, Windows 2008 R2 veritabanı sunucusu yükseltilmiş X5470 a X5560 . Teori, X5560'ın biraz daha hızlı olması durumunda her iki CPU'nun da benzer bir performansı var.

Ancak, SQL Server 2008 R2 performansı son günlerde oldukça kötüydü ve CPU kullanımı oldukça fazlaydı.

Sayfa ömrü beklentisi çok büyük, sayfalar için neredeyse% 100 önbellek isabet alıyoruz, bu nedenle hafıza bir sorun değil.

Koştuğum zaman:

SELECT * FROM sys.dm_os_wait_stats 
order by signal_wait_time_ms desc

Bende var:

wait_type waiting_tasks_count wait_time_ms max_wait_time_ms signal_wait_time_ms'ın
-------------------------------------------------- ---------- -------------------- -------------------- -------------------- ----------------------
XE_TIMER_EVENT 115166 2799125790 30165 2799125065
REQUEST_FOR_DEADLOCK_SEARCH 559393 2799053973 5180 2799053973
SOS_SCHEDULER_YIELD 152289883 189948844 960 189756877
CXPACKET 234638389 2383701040 141334 118796827
SLEEP_TASK 170743505 1525669557 1406 76485386
LATCH_EX 97301008 810738519 1107 55093884
LOGMGR_QUEUE 16525384 2798527632 20751319 4083713
WRITELOG 16850119 18328365 1193 2367880
PAGELATCH_EX 13254618 8524515 11263 1670113
ASYNC_NETWORK_IO 23954146 6981220 7110 1475699

(10 satır etkilendi)

Ben de koştum

-- Isolate top waits for server instance since last restart or statistics clear
WITH Waits AS (
   SELECT 
        wait_type, 
        wait_time_ms / 1000. AS [wait_time_s],
        100. * wait_time_ms / SUM(wait_time_ms) OVER() AS [pct],
        ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS [rn]
FROM sys.dm_os_wait_stats
WHERE wait_type NOT IN ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE',
    'SLEEP_TASK','SLEEP_SYSTEMTASK','SQLTRACE_BUFFER_FLUSH','WAITFOR','LOGMGR_QUEUE',
    'CHECKPOINT_QUEUE','REQUEST_FOR_DEADLOCK_SEARCH','XE_TIMER_EVENT','BROKER_TO_FLUSH',
    'BROKER_TASK_STOP','CLR_MANUAL_EVENT','CLR_AUTO_EVENT','DISPATCHER_QUEUE_SEMAPHORE',
    'FT_IFTS_SCHEDULER_IDLE_WAIT','XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN'))

SELECT W1.wait_type, 
    CAST(W1.wait_time_s AS DECIMAL(12, 2)) AS wait_time_s,
    CAST(W1.pct AS DECIMAL(12, 2)) AS pct,
    CAST(SUM(W2.pct) AS DECIMAL(12, 2)) AS running_pct
FROM Waits AS W1
INNER JOIN Waits AS W2 ON W2.rn <= W1.rn
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct
HAVING SUM(W2.pct) - W1.pct < 95; -- percentage threshold

Ve var

wait_type wait_time_s pct Instagram Hesabındaki Resim ve Videoları running_pct
CXPACKET 554821.66 65,82 65,82
LATCH_EX 184123.16 21.84 87.66
SOS_SCHEDULER_YIELD 37541.17 4.45 92.11
PAGEIOLATCH_SH 19018.53 2.26 94.37
FT_IFTSHC_MUTEX 14306.05 1.70 96.07

Paralellik içeren yüksek senkronize sorguları (yüksek CXPACKET) gösterir. Ek olarak, bu sorun sorgularının birçoğu birden çok çekirdekte yürütülüyor (kodumuzda hiçbir yerde MAXDOP ipucumuz yok)

Sunucu bir günden fazla bir süredir yüklenmedi. Sorgu işlemlerinde büyük miktarda değişiklik yaşıyoruz, genellikle birçok sorgu önceki DB sunucumuzda daha yavaş görünüyor ve CPU gerçekten yüksek.

Hyperthreading'i devre dışı bırakmak CPU kullanımımızı azaltmamıza ve verimliliği artırmamıza yardımcı olur mu?



CXPACKET'in işlemlerin bir araya gelmesini bekleyen çok fazla zaman olduğu anlamına gelmediğini unutmayın. CXPACKET, iş parçacığının işlenmesi için başka bir iş parçacığı beklediği anlamına gelir. CXPACKET beklemesinde bir iş parçacığı olan belirli bir sorguya bakmanız ve CXPACKET dışında diğer iş parçacıklarının neler beklediğini görmeniz gerekir. Genellikle IO veya ağdır. Yukarıdaki çıktıda mandalları bekliyor ve soyuluyorsunuz. Bazı sorguların ayarlanması gerekiyor veya mandalın neden alındığını görmeniz gerekiyor.
mrdenny

Bizim durumumuzda, CXPACKET diğer konular sadece önbellekten çok fazla okuduğu için yüksek (sorgu başına 20 milyon mantıksal okuma). Davamız, yine, sadece 700K satır olan bölümlenmiş bir tablonun bulunduğu kötü bir anti-semijoin idi.
ozamora

@mrdenny, evet, yüksek mandal bekleme süresi, şu anda onu araştırıyoruz.
Sam Saffron

Yanıtlar:


10

Hala hissediyorum özel iş yükünü test orijinal Yanıt başına kadar, emin olmak için tek yoldur. Bir üretim sistemini ayarlamaya çalışırken ideal bir cevap değil (bu yüzden hem performansın hem de kullanılabilirliğin gerçekten önemli olduğu sistemlerde aynı test testini almak mümkün olup olmadığını sordum) ama gerçekten rahat olduğum tek şey ile.

Hyperthreading'in genel olarak bazı şeylere zarar vermesi veya iyileştirmesi gerekip gerekmediği teorisinden bahsedebiliriz (muhtemelen onu devre dışı bırakacağım "genel" bir dağıtım için sunuculardaki yardımdan daha fazla incinmesi daha muhtemeldir), ancak Özel davanızda bir fark yaratıp yaratmayacağından emin olmanın tek yolu bu, ve denemek ve görmek.


3
Not Oy vermedim, alabileceğimiz her türlü yardıma ihtiyacımız var, ancak bir üretim sisteminde karanlıkta bıçaklanmalardan kaçınmak istiyoruz. Aramayı bu ayarla oynamaya başlamadan önce yeterince teşhis topladığımızdan emin olmak istiyorum.
Sam Saffron

3
Eminim bir üretim sistemiyle oynamaktan kaçınmak istersiniz, ideal bir dünyada hepimiz bu nedenle üretime özdeş test ortamlarına sahip oluruz. Spekülatif üretimi değiştirmek istememeye katılıyorum. Bununla birlikte, cevabımı hazırım: Belirli iş yüklerini test etmek, konuşlandırmanın önemli bir parçası ve size farklı olduğunu söyleyen herkes bir şarlatan. Benim için tüm işaretler burada hiper-tehdit sorun olduğunu gösteriyor ama bütün gün ve bütün gece olaylardan bahsedebiliriz ve hala kesin olarak bilmenin tek bir yolu olacak.
Rob Moir

5
Burada oy - cevap ile katılıyorum. Genel cevap: Hyperthreading'i kapatın. Daha spesifik bir cevap: Şartnameye göre değişir ve TEST EDİLMELİDİR.
TomTom

1
İşin tuhafı, kabul etmek için en iyi cevap olduğunu düşünüyorum, maxdop ayarlarıyla uğraşmak çok fazla soruna yol açabilir, nehalem cpus biraz daha yavaş saat hızlarında bile çekirdek tabanlı xeonlardan çok daha hızlı, biraz önbelleğe alınmış argümanları biraz buluyorum kırmızı bir ringa balığı çünkü L3 önbellek çok daha büyük. Zeyilname olarak bakınız: blog.stackoverflow.com/2010/10/database-upgrade , eğer birisi% 20'den fazla isabet / kazanç görüyorsa ... muhtemelen HT'ye bağlı değildir.
Sam Saffron

@TomTom ve @Robert'in tam tersini yaşadım. HT'nin genellikle% 10-15 daha iyi olduğunu buldum. Bunu kapatmanın olayı performansı arttırdığı günler ender görülüyor.
Brian Knoblauch

12

Katılıyorum

  • en iyi öneri "iş yükünüzde HyperThreading'i deneyin ve ne olduğunu görün" şeklindedir. Bunu şu anda yazarken yapıyoruz ve .. iyi değil!
  • muhtemelen her zaman HyperThreading disabled ile başlamalısınız, çünkü en güvenli

İki şeyi ayarlamamız gerekiyor gibi görünüyor:

  1. MAXDOP (Maksimum Paralellik Dereceleri). Okuduğum her şey bu sınırsız olanın muhtemelen kötü bir fikir olduğunu ve Microsoft belgelerinin olduğunu gösteriyor şöyle diyor:

    Bu seçeneğin [MAXDOP] daha büyük bir değere [8'den daha] ayarlanması, istenmeyen kaynak tüketimine ve performansın düşmesine neden olur.

    8Genel olarak tavsiye edilenden daha yüksek bir şey .. bu yüzden 4şimdilik Başlangıçta sıfır (sınırsız) idi.

  2. Paralellik için Maliyet Eşiği. Görünüşe göre, buradaki varsayılan, 5bulduğum birkaç SQL MVP gönderisine göre oldukça düşük bir varsayılan olarak kabul edilir - zamanlayıcı tarafından ne kadar paralelliğin denendiğini azaltmak için ayarlayabiliriz .

Ama dürüst olmak gerekirse, bunlar geçici çözümler gibi hissediyor; İş yükümüzün (tam metin dizini ağır) gerçek çözümünün HT'yi devre dışı bırakmak olduğunu düşünüyorum.


4
MAXDOP ayrıca, 8 çekirdekli ve 16 iş parçacığı varsa ve aynı anda iki iş parçacığı çalıştırmayı deneyebileceği için HT ile ilgili sorunlara da neden olabilir ve maksdop'unuz 10 olarak ayarlanmıştır. Genellikle mantıksal işlemci başına 1 MAXDOP olmalıdır. Aynı işlem için aynı işlemcide iki iş parçacığı yürütmek anlamsız.
Mark Henderson

2
@Farseeker, yalnızca HyperThreading uyumlu bir işletim sisteminiz yoksa gerçekleşir. 2000'den daha yeni Windows bunun farkında.
Mircea Chirea

Bu maxdop geçersiz kılmaların sadece soruna yol açtığını belirtti. varsayılan bizim için iyi oldu
Sam Saffron

2
SQL Server'ın standart sürümü sınırsız kaldığında yine de MAXDOP 4'te maksimuma çıkar. Bundan daha yükseğe çıkmak için Kurumsal'a ihtiyacınız var. MAXDOP 1 ile en hızlı giden bazı iş yüklerimiz oldu (HT olmayan kutu, 8 çekirdekli AMD çalıştıran) ...
Brian Knoblauch

1
@Brian Knoblauch - Bunu bir yıl sonra biliyorum, ancak bu "SQL Server'ın Standart sürümü MAXDOP'ta sınırsız kaldığında en fazla 4 kez çıkabiliyor". Şu anda işte MAXDOP kullanmaktan bahsediyoruz ancak neye ayarlayacağımızdan emin değiliz. Bu, temel olarak, 4'ün sınırsız doğru olduğu anlamına gelir.
Jeremy A. West

9

Anandtech saf okuma yükü ile biraz incindi ve ağır bir yük ile biraz kazanıldığını buldu. Seni% -5'ten çok daha kötü bir isabet alacağını ya da% 15'ten daha iyi bir kazanç elde edeceğini düşündürecek bir şey görmedim. Atom ile neyin kazandığına dikkat edin, ancak bu çok garip bir işlemci.

Tek değiştirdiğin CPU mu? 12 MB önbellek ve 4 iş parçacığı, yani iş parçacığı başına 3 MB önbellek, 8 MB önbellek ve 8 iş parçacığı, iş parçacığı başına 1 MB önbellek. Şimdi, bu aşırı basitleştirici, ama iddiaya girerim ki, seni öldüren şey, önbellekte sorguları çalıştırıyordun ve şimdi de RAM'den çalıştırıyorlardı, çünkü 1 MB'den daha fazla ama 3 MB'den daha azına ihtiyaç duyuyorlar. HT'yi kapatmak muhtemelen yardımcı olacaktır, ancak eski CPU'ya geri döneceğim. HT'yi kapatın ve iş parçacığı başına 2 MB elde edin, ancak iş yükünüz o kadar fazla tıkanırsa işe yaramaz. Eski 12MB önbellek işlemcisi iş yükünüz için oldukça hızlı olabilir.

HT'yi kapatmayı deneyeceğim ve bunun bir gelişme olup olmadığını göreceğim, ancak önbelleğin iş yükünüz için önemli olduğundan şüpheliyim ve 12 MB yongasına geri dönmeniz gerekebilir.


3
Çekirdek gözlem başına L2 önbellek büyük bir basitleştirmedir, çünkü CPU bir tam nesil ileridedir (Nehalem / Core i7 - Core 2 Quad sınıfı).
Jeff Atwood

@Jess, @Ronald ve Nehalem'in çok az L2 önbelleği var. Hacim, çekirdekler arasında paylaşılan L3'tür.
Mircea Chirea

7

Hyperthreading, en iyi şekilde, sadece bir L1 ve L2 önbelleğine doğrudan erişimi olan ve böylece bir iş yükünün daha hızlı bir şekilde değiştirilmesini sağlayan işletim sisteminden uzaklaşan ve kalıba yerleştiren bir soyutlama yöntemidir.

VMWare ile yapılan testler, HT'nin devre dışı bırakılmasının, standart yük altında fark edilemez bir fark yaratmadığını ve ağır yük altında% 5 artış olduğunu, ESXi'nin "gerçek" iplik ile "sahte" iplik arasındaki farkı bilecek kadar akıllı olmasından kaynaklandığını göstermiştir. (bundan çok daha fazlası var, ama bu meslekten olmayan terimlerle). SQL Server 2005 o kadar akıllı değil, ancak güncel bir işletim sistemi ile birleştirildiğinde HT'yi devre dışı bırakmanın çok az avantajı olmalı.

Bütün bunlar, Ronald ile büyük olasılıkla L2 önbelleğin olacağına katılıyorum. Önbellek boyutunda% 33'lük bir düşüş önemlidir ve SQL Sunucularımızı belirlediğimizde her zaman ham saat hızının üzerinde önbellek tutarız.


Doğru 4 çekirdeği SQL tarafından göz ardı edilecek şekilde dışsal ilişkiyi ayarlayabilir misiniz?
Sam Saffron

3
Genel olarak, birbirinize CPU iş parçacığına yakınlık koyarsınız, ancak MAXDOP doğru ayarlandığı sürece, yakınlık ayarlamaya gerek yoktur. HT ile bir CPU'ya ulaşan ilk iş parçacığı "ana" iş parçacığı olur ve ikinci iş parçacığı "HT" iş parçacığı olur. Gerçekte "main" ve "ht" thread'leri yoktur, çünkü hangisi önce oraya gelirse, ve görev değiştirdiğinde sıra tersine çevrilir.
Mark Henderson

Nehalem tabanlı CPU'ların çoğunda L3 paylaşılan ÇOK, ÇOK KÜÇÜK L2 önbellek var.
Mircea Chirea

7

Tecrübelerime dayanarak, HT bir Windows 2008 R2 Kümesinde (SQL Server 2008 R2 çalıştıran) etkin düğümlerimde G / Ç işlemlerini sonsuza dek sürdürüyordu. İlginç bir gerçek, ne bekleme istatistiklerine ne de Microsoft desteği için koştuğum pssdiag'e yansıtılmamasıydı.

Düşük G / Ç'yi farketme yöntemim, yalnızca fiziksel disk için işletim sistemi sayaçlarını izlemekti. Sam'in işaret ettiği gibi, burada ve burada yazdım.

G / Ç sorunları yaşamıyorsanız ve CPU'ya bağlıysanız, bu şekilde başlamanızı öneririm:

Hangi işlemleri ve T-SQL bloklarını en fazla CPU kullanımına neden olduğunu tespit edin. Tecrübelerimize göre, sorunu G / Ç ile düzelttikten sonra (HT'yi kapatarak) 2008 R2'de korkunç performans gösteren ve 2005'te iyi sonuç veren kodları belirledik . Burada yazdım .

Yük altındayken, Adam Machanic'in sp_whoisactive'i çalıştırın. Buradan indirebilirsiniz . Çok kötü bir plandan dolayı aşırı miktarda mantıksal okuma (sorgu başına 20 milyon) nedeniyle çok yüksek bir CPU kullanımı yaşıyorduk. Süreçlerimiz bölümlenmiş masalarla yarı anti birleşme gerçekleştiriyordu.

Bir sonraki tavsiyem hem CPU hem de I / O mantıksal okumaları yüksek olan bir dizi T-SQL kodu tanımlamak için profiler çalıştırmak.

Yukarıdaki adımlarla, rahatsız edici süreçleri ayarlayabildik ve% 85'lik sürekli CPU kullanımından neredeyse hiçbir zaman geçemedik.

İyi Şanslar ve davayı bloguma eklemek istediğim gibi bir düzeltme bulursanız bana bir satır bırakmaktan çekinmeyin.

Teşekkürler

Oskar


1
Profil sahibi için +1, sorunlu bir nokta tespit edildiğinde beni çok uzun zaman kurtardı
Mark Henderson

+1 tüm önerileriniz için teşekkür ederiz, SQL'imizi makul bir seviyeye ayarlamak tam bir kabustur, tam olarak metne bağımlıyız, etiketlerle olan ilişkilerimiz için, çoğu zaman belirli etiketlerden oluşan bir ürün listesi arıyoruz. ayarlayın ve filtreleyin. Örneğin, tarihe göre sıralanan [x] ve [y] etiketli soruların bir listesini almak, tam metinden büyük miktarda veri çekmeyi ve ardından büyük bir birleşmeyi içerir.
Sam Saffron

Anladım. Bir örnek alın ve istatistik IO ON ile çalıştırın ve en mantıksal okumaya sahip herhangi bir tabloyu tespit edip edemediğinizi görün. Yine, 2005’te gayet iyi ve 2008 R2’de gerçekten kötü durumdaydık. CPU kullanımını yalnızca yüksek buluyorsanız ve yüksek bir CXPACKET beklemeniz varsa, önce paralellik için Maliyet
Eşiğini

Başka hiçbir şey yardımcı olmazsa, DB çevrimdışı, HT'yi kapatın ve oradan gidin. İyi şanslar
ozamora

sp_whoisactive oldukça harika bir araçtır, sorguların tıklanma şeklini seviyorum
Sam Saffron

2

HT'nin iyi veya kötü olup olmadığını tespit etmek zordur.

Gerçekten de deneyim ve okumaya bağlı olarak sunucu yük modeline bağlı. Yani, performansı etkilediğinde çok kötü bir şekilde yapıyor : aksi halde farketmezsiniz.

Okuduğum teori, konuların önbelleği paylaşmasıydı; bu, olumsuz koşullar altında, her bir iş parçacığının diğer iş parçasının önbelleğinin üzerine yazabileceği anlamına geliyor. Çok fazla paralelliğiniz yoksa veya yükünüz çok kısa sorgu ise, sizi etkilemeyebilir.

MAXDOP ve işlemci benzeşimi ile denedim (SQL Server 2000'deki son gerçek DBA rolüme geri döndüm) ancak hiçbir zaman kesin bir şey bulamadım: ama sadece o zaman dükkanım için.

Hızlı bir test olarak, yalnızca fiziksel çekirdeği (düşük sayılar) kullanacak şekilde işlemci benzeşimini ayarlayabilir ve ne olduğunu görebilirsiniz.

Ancak, çoğu zaman çekirdeklerinin yarısını kaybedersiniz. Bugünlerde birkaç yıl önce 2 ile 4 ya da 4 ile 8 arasında oynadığım oyunla kıyaslandığım önemli değil. Şimdi 8 ile 16 veya 16 ile 32 arasında.

Düzenleme: Slava Oks tarafından bir test


0-3 fiziksel ve 4-7 mantıksal mıdır? Böyle mi çalışıyor?
Jeff Atwood

2
@Jeff Atwood: Daha sonra bulacağım. Ben var Şimdilik .... yerde okumak: support.microsoft.com/kb/322385
GBN

Bu KB makalesi hemen hemen özetliyor.
pauska

Bu KB makalesinde bazı yararlı bilgiler bulunmasına rağmen, Jeff'in mantıksal işlemcilerin tam olarak fiziksel olanlarla nasıl eşleştirildiği sorusuna doğrudan yanıt vermiyor gibi görünüyor. Beynim yarı yolda kızardı, ama umarım bu INTEL makalesi, haritalandırmayı çözmeniz için gerekenleri size vermelidir: software.intel.com/en-us/articles/… ayrıca bkz. Software.intel.com/en-us/ / 2009/12/21 /… blogları ile ilgili linkler.
BradC

@Jeff Atwood, @ Brac: Lordy, bulmak zor. Şuna bakın: Intel önerilerine dayanır. SQL Server, temel Windows numaralandırma download.microsoft.com/download/5/7/7/… 'yi kullanacaktır .
gbn

2

Ne yazık ki, "aşırı köprüyü kapatmayı dene ve bunun işe yarayıp yaramadığını görmekten" daha kesin bir cevap alacağını sanmıyorum.

Asıl konu başlığımdaki Jonathan'ın (cevabınızla ilgili sorunuzu yaptığınız) yararlı cevabına rağmen, HT'nin araştırdığım belirli sunucular üzerindeki etkisi hakkında kesin bir kanıt elde edemedim. Benim durumumda, sunucular zaten değiştirilmek üzere programlanmışlardı, bu yüzden sadece değiştirmeleri "konuyla ilgilenmek" için bıraktık.

Benim tavsiyem:

Sunucu düzeyinde MAX 1 Paralellik derecesi ayarını deneyin . SQL paralellik olduğu en zaten büyük, daha uzun çalışan sorguları için yararlıdır, ve yük (ı varsayalım) zaten daha küçük sorgu kitlesel yüksek sayıda oluşur. Bu tamamen CXPACKET beklemelerini ortadan kaldırmalı. Bu, belirli bireysel sorguların biraz daha uzun çalışmasına neden olabilir, ancak sunucudaki toplam sorguların daha fazla "üretilmesine" izin vermelidir.

OLTP sunucularında bunu yaparken iyi sonuçlar aldım. Diğer tür sunucular (raporlama sunucuları, işlem sunucuları, veri depolama) kesinlikle daha yüksek bir MAXDOP'a ihtiyaç duyar.

Ve açık olmak gerekirse, bu ayar SQL'in bir JOIN'deki her tablo için birden fazla iş parçacığı kullanmasına izin verecek, bu yüzden paralellikten tamamen kurtulmuyorsunuz.

En azından bir denemeye değer, çünkü bu ayar değişikliği derhal yürürlüğe girer ve hatta SQL servisini yeniden başlatmanızı gerektirmez: http://msdn.microsoft.com/en-us/library/ms181007.aspx
Bu, değiştirebileceğiniz anlamına gelir İşler cehenneme gitmeye başlarsa hemen geri döndü.

BIOS'ta hiper-tıkanmayı kapatmak, tam bir sunucunun yeniden başlatılmasını gerektirir, bu yüzden biraz daha risklidir.


0

Kayıt için, sunucu güncellemesinden sonra beklenmedik bir şekilde kötü performans gösterdik. BIOS ve CPU güç tasarrufu ile ilgili sorunlar olduğu ortaya çıktı. Sunucudaki (HP) varsayılan ayar CPU hızının OS kontrolünü yoksaymak ve kendi algoritmasını kullanmaktı. Bunu işletim sistemi kontrolüne değiştirmek ve BIOS'u güncellemek önemli gelişmelerle sonuçlandı. İşlemciyi en düşük performans durumunda kilitleyen bir BIOS hatası olduğunu gösteren bazı sürüm notları (bunları şimdi bulamıyorum) vardı.

https://serverfault.com/a/196329/6390

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.