하이퍼 스레딩을 비활성화하면 SQL Server 설치에서 성능이 향상됩니다.


28

관련 : SQL Server 및 하이퍼 스레딩에 대한 현재의 지혜

최근에 Windows 2008 R2 데이터베이스 서버를 X5470 에서 X5560으로 업그레이드했습니다 . X5560이 조금 더 빠르면 두 CPU의 성능이 매우 비슷하다는 이론이 있습니다.

그러나 SQL Server 2008 R2 성능은 지난 하루 동안 상당히 나빴으며 CPU 사용량은 꽤 높습니다.

페이지 예상 수명이 엄청 나서 페이지에 대해 거의 100 %의 캐시 적중률을 얻으므로 메모리는 문제가되지 않습니다.

내가 달릴 때 :

SELECT * FROM sys.dm_os_wait_stats 
order by signal_wait_time_ms desc

나는 얻었다 :

wait_type waiting_tasks_count wait_time_ms max_wait_time_ms signal_wait_time_ms
-------------------------------------------------- ---------- -------------------- -------------------- -------------------- --------------------
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 행 영향을 받음)

나도 달렸다

-- 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

그리고있어

wait_type wait_time_s pct 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

병렬 처리 (높은 CXPACKET)와 관련된 쿼리를 동기화하는 데 많은 시간이 소요됩니다. 또한, 이러한 많은 문제 쿼리가 여러 코어에서 실행되고있는 경우도 있습니다 (코드의 어느 곳에도 MAXDOP 힌트가 없습니다)

서버가 하루 이상로드되지 않았습니다. 쿼리 실행에 많은 차이가 있으며 일반적으로 많은 쿼리가 이전 DB 서버에 비해 느리고 CPU가 실제로 높습니다.

하이퍼 스레딩을 비활성화하면 CPU 사용량을 줄이고 처리량을 늘리는 데 도움이됩니까?



CXPACKET이 프로세스가 병합되기를 기다리는 데 시간이 많이 걸리는 것은 아닙니다. CXPACKET은 스레드가 다른 스레드가 처리를 완료하기를 기다리고 있음을 의미합니다. CXPACKET 대기에 스레드가있는 특정 쿼리를보고 CXPACKET 외에 다른 스레드가 대기중인 항목을 확인해야합니다. 일반적으로 IO 또는 네트워크입니다. 위의 출력에서 ​​래치를 기다리고 일정을 잡고 있습니다. 일부 쿼리를 조정해야하거나 왜 래치가 걸리는지 알아야합니다.
mrdenny

우리의 경우 CXPACKET은 다른 스레드가 캐시에서 과도하게 읽기 때문에 쿼리 당 2 천만 개의 논리적 읽기이므로 CXPACKET이 높았습니다. 우리의 경우는 다시 분할 된 테이블이 700K 행에 불과한 잘못된 반 세미 조인이었습니다.
ozamora

@mrdenny, 그렇습니다. 높은 래치 대기 시간은 현재 조사 중입니다.
Sam Saffron

답변:


10

원래 답변에 따라 특정 작업 부하테스트 하는 것이 유일한 방법이라고 생각합니다. 프로덕션 시스템을 조정하려고 할 때 이상적인 대답은 아닙니다 (따라서 성능과 가용성이 모두 중요한 시스템에서 동일한 테스트 베드를 얻을 수 있는지 묻고 싶습니다). 와.

우리는 하이퍼 스레딩이 일반적인 문제를 해치거나 개선해야하는지에 대한 이론에 대해 이야기 할 수 있습니다 (서버에 대한 도움보다 상처를 입을 가능성이 더 높기 때문에 "일반적인"배포의 경우에는 사용하지 않을 것입니다). 특정 사례에 차이가 있는지 확인하는 한 가지 방법 만 시도해보십시오.


3
참고 공감하지는 않았지만 가능한 모든 도움이 필요하지만 프로덕션 시스템에서 어둠 속에서 찌르는 것을 피하고 싶습니다. 이 설정을 사용하여 전화를 걸기 전에 충분한 진단을 수집했는지 확인하고 싶습니다.
Sam Saffron

3
프로덕션 시스템에서 '재생'을 피하고 싶을 것입니다. 이상적인 세상에서는 테스트 환경이 프로덕션과 동일한 환경에 있습니다. 나는 투기에서 생산을 바꾸고 싶지 않다는 데 동의합니다. 그러나 나는 내 대답을 기다립니다 : 특정 작업 부하를 테스트하는 것은 모든 배포 에서 중요한 부분 이며 다른 사람은 자선 단체입니다. 나를 위해 모든 표시는 하이퍼 스레딩이 여기에서 문제가됨을 나타내지 만 하루 종일 밤새 이야기 할 수 있으며 여전히 알 수있는 한 가지 방법 만 있습니다.
Rob Moir

5
여기에 찬성 투표-답변에 동의합니다. 일반적인 대답은 다음과 같습니다. 하이퍼 스레딩을 끕니다. 더 구체적인 대답은 다음과 같습니다. 세부 사항에 따라 다르며 테스트를 받아야합니다.
TomTom

1
이상하게도, 이것이 maxdop 설정으로 뭉쳐서 많은 문제를 일으킬 수 있으며, nehalem cpus는 약간 느린 클럭 속도에서도 코어 기반 xeon보다 훨씬 빠릅니다. 빨간 청어의 원인은 l3 캐시가 너무 큽니다. 부록으로 blog.stackoverflow.com/2010/10/database-upgrade를 참조하십시오. 누가 20 % 이상의 히트 / 게인을보고 있다면 HT 때문이 아닙니다.
Sam Saffron

@TomTom과 @Robert와 반대되는 경험을했습니다. 나는 HT on이 일반적으로 off보다 10-15 % 더 낫다는 것을 알았습니다. 전원을 끄면 성능이 향상되는 경우는 거의 없습니다.
Brian Knoblauch

12

동의합니다

  • 에서 최고의 추천은 "작업 부하에 하이퍼 스레딩을 시도하고 무슨 일이 일어 나는지"입니다. 입력하는 동안 지금이 작업을 수행하고 있습니다. .. 좋지 않습니다!
  • 가장 안전한 하이퍼 스레딩으로 시작해야합니다.

다음 두 가지를 조정해야합니다.

  1. MAXDOP (최대 병렬 처리 수준). 내가 읽은 모든 것은 이것이 무한한 아이디어는 아마도 나쁜 생각이며 Microsoft 설명서 는 다음 과 같이 말합니다.

    이 옵션 [MAXDOP]을 8보다 큰 값으로 설정하면 원치 않는 리소스 소비 및 성능 저하가 종종 발생합니다.

    8일반적으로 권장되지 않는 것보다 높은 것은 .. 그래서 지금 설정했습니다 4. 처음에는 0이었습니다.

  2. 병렬 처리에 대한 비용 임계 값. 5필자가 찾은 몇 가지 SQL MVP 게시물에 따르면 여기 의 기본값은 매우 낮은 기본값으로 간주 됩니다. 스케줄러가 시도하는 병렬 처리량을 줄 이도록 조정할 수 있습니다 .

그러나 솔직히 이것들은 해결 방법처럼 느껴집니다. 우리의 워크로드 (전체 텍스트 인덱스 헤비)에 대한 진정한 해결책은 HT를 비활성화하는 것입니다.


4
MAXDOP은 또한 8 개의 코어와 16 개의 스레드가 있고 maxdop가 10으로 설정되어 있으면 동일한 CPU에서 두 개의 스레드를 실행하려고 시도 할 수 있으므로 HT에 문제가 발생합니다. 일반적으로 논리 프로세서 당 1 개의 MAXDOP가 최대 여야합니다. 동일한 프로세스에서 동일한 CPU에서 두 개의 스레드를 실행하는 것은 무의미합니다.
Mark Henderson

2
HyperThreading 인식 운영 체제가없는 경우에만 발생하는 @Farseeker. 2000 이전의 Windows가이를 인식합니다.
Mircea Chirea

이러한 maxdop 재정의는 문제를 일으킨다는 점에 주목할 가치가 있습니다. 기본은 우리에게 좋았습니다
Sam Saffron

2
어쨌든 표준 버전의 SQL Server는 MAXDOP에서 최대 4로 제한됩니다. 그보다 더 높은 기업이 필요합니다. MAXDOP 1 (HT가 아닌 상자, 여러 개의 8 코어 AMD를 실행)로 가장 빠른 워크로드가있었습니다 ...
Brian Knoblauch

1
@Brian Knoblauch-1 년 후이 사실을 알고 있지만이 "표준 SQL Server 버전은 제한이없는 경우 어쨌든 최대 4의 MAXDOP에서 최대치"에 도달했습니다. 우리는 현재 직장에서 MAXDOP를 사용하는 것에 대해 이야기하고 있지만 어떻게 설정할지 확실하지 않습니다. 이것은 기본적으로 4가 바인딩되지 않은 것과 동일하다는 것을 의미합니까?
Jeremy A. West

9

Anandtech는 순수한 읽기로드를 사용하면 약간 아프고 쓰기로드가 많으면 약간의 승리라는 것을 알았습니다. 나는 당신이 -5 %보다 훨씬 더 많은 타격을 입히거나 15 %보다 훨씬 더 좋은 결과를 얻을 것이라고 생각하게 만드는 것을 보지 못했습니다. Atom의 경우 큰 승리이지만 매우 이상한 CPU입니다.

CPU 만 바꿨나요? 12MB 캐시와 4 개의 스레드에서 스레드 당 3MB의 캐시, 8MB의 캐시 및 8 개의 스레드, 즉 스레드 당 1MB로 이동했습니다. 자, 그것은 지나치게 단순화되었지만, 당신을 죽이는 것입니다. 캐시에서 쿼리를 실행하고 이제 1MB 이상 3MB 미만이 필요하기 때문에 RAM에서 쿼리를 실행했습니다. HT를 끄면 도움이 될지 모르지만 이전 CPU로 돌아갑니다. HT를 끄면 스레드 당 2MB가 발생하지만 워크로드가 많이 발생하면 도움이되지 않습니다. 이전 12MB 캐시 CPU가 워크로드에 비해 훨씬 빠를 수 있습니다.

나는 HT를 끄려고 노력하고 그것이 개선인지 확인하지만 캐시가 작업 부하에 왕력이 있다고 생각하며 12MB 칩으로 돌아 가야 할 수도 있습니다.


3
코어 당 L2 캐시 는 CPU가 한 세대 앞선 (Nehalem / Core i7 vs. Core 2 Quad 클래스)이기 때문에 대규모 단순화입니다.
Jeff Atwood

@Jess, @Ronald 및 Nehalem은 L2 캐시가 거의 없습니다. 벌크는 L3이며 코어간에 공유됩니다.
Mircea Chirea

7

하이퍼 스레딩은 L1 및 L2 캐시에 직접 액세스하여 운영 체제에서 작업 전환을 추상화하고이를 다이 배치하는 방법 중 하나 일 뿐이므로 작업 전환을보다 빠르게 처리 할 수 ​​있습니다.

VMWare로 테스트 한 결과 HT를 비활성화하면 표준로드에서 식별 할 수있는 차이가없고 ESXi가 "실제"스레드와 "가짜"스레드의 차이를 알 수있을만큼 똑똑하기 때문에로드가 큰 경우 5 % 증가한 것으로 나타났습니다. ( 그것보다 훨씬 더 많지만 평신도 용어입니다.) SQL Server 2005는 그다지 똑똑하지는 않지만 최신 운영 체제와 결합하면 HT를 사용하지 않는 이점이 거의 없습니다.

나는 로널드가 L2 캐시가 될 가능성이 가장 높다는 것에 동의합니다. 캐시 크기가 33 % 감소한 것은 상당하며 SQL Server를 지정할 때마다 항상 매번 클럭 속도를 넘어 캐시로 이동합니다.


SQL에서 오른쪽 4 개의 코어를 무시하도록 선호도를 외부 적으로 설정할 수 있습니까?
Sam Saffron

3
일반적으로 서로 다른 CPU 스레드에 선호도를 설정하지만 MAXDOP가 올바르게 설정되어 있으면 선호도를 설정해야 할 이유가 없습니다. HT를 사용하면 CPU에서 첫 번째로 맞 물리는 스레드가 "메인"스레드가되고 두 ​​번째 스레드는 "HT"스레드입니다. 그러나 실제 "메인"및 "ht"스레드는 없습니다. 스레드가 먼저 도착한 다음 작업 전환시 순서가 반대로되어 있기 때문입니다.
Mark Henderson

Nehalem 기반 CPU는 VERY, VERY LITTLE L2 캐시를 가지고 있으며 대부분 L3이 공유합니다.
Mircea Chirea

7

내 경험을 바탕으로 HT는 Windows 2008 R2 클러스터 (SQL Server 2008 R2 실행)의 활성 노드에서 I / O 작업을 영원히 수행하도록했습니다. 흥미로운 사실은 대기 통계 나 Microsoft 지원을 위해 실행 한 pssdiag에 반영되지 않았다는 것입니다.

낮은 I / O를 발견 한 방법은 물리적 디스크의 OS 카운터를 보는 것입니다. 샘이 지적했듯이 여기여기에 대해 썼습니다

I / O 문제가 발생하지 않고 CPU가 제한되어 있으면 다음과 같이 시작하십시오.

어떤 프로세스 및 T-SQL 블록이 CPU 사용률을 가장 많이 발생시키는 지 파악하십시오. 경험상 I / O 관련 문제를 해결 한 후 (HT를 끈 상태) 2008 R2에서 끔찍하게 수행되고 2005 년에 잘 수행되는 코드를 확인했습니다 . 여기에 썼습니다 .

부하가 높은 상태에서 Adam Machanic의 sp_whoisactive를 실행하십시오. 여기 에서 다운로드 할 수 있습니다 . 계획이 잘못되어 과도한 논리적 읽기 (쿼리 당 2 천만 건)로 인해 CPU 사용률이 매우 높았습니다. 우리의 프로세스는 분할 된 테이블과 반 세미 조인을 수행했습니다.

다음 권장 사항은 프로파일 러를 실행하여 CPU 및 I / O 논리적 읽기가 높은 T-SQL 코드 세트를 식별하는 것입니다.

위의 단계를 통해 우리는 문제가되는 프로세스를 조정하고 85 %의 지속적인 CPU 사용률에서 거의 없음으로 이동할 수있었습니다.

행운을 빕니다. 제 블로그에 사례를 추가하고 싶은대로 수정 사항을 찾으면 언제든지 연락 주시기 바랍니다.

감사

오스카


1
프로파일 러 +1, 문제 지점이 확인되면 많은 시간을 절약했습니다.
Mark Henderson

모든 제안에 대해 +1 감사합니다 .SQL을 합리적인 수준으로 조정하는 것은 완전히 악몽입니다. ​​우리는 태그 처리에 대해 전체 텍스트에 상당히 의존합니다. 우리는 종종 특정 태그의 항목 목록을 찾고 있으므로 전체를 가져옵니다. 설정하고 필터링하십시오. 예를 들어 날짜순으로 [x] 및 [y] 태그가 포함 된 질문 목록을 얻으려면 전체 텍스트에서 대량의 데이터를 가져온 다음 대규모 조인을 수행해야합니다.
Sam Saffron

이해했다. 하나의 샘플을 가져 와서 통계 IO ON으로 실행하고 가장 논리적으로 읽은 테이블을 정확히 찾아 낼 수 있는지 확인하십시오. 다시 한 번, 우리는 2005 년에 잘 지냈고 2008 년 R2에 정말 좋지 않았습니다. CPU 사용률이 높고 CXPACKET 대기 시간이 높은 경우 병렬 처리에 대한 비용 임계 값을 10, 15 또는 20으로
늘려보십시오

아무것도 도움이되지 않으면 DB를 오프라인으로 전환하고 HT를 끈 다음 거기서 나가십시오. 행운을 빕니다
ozamora

sp_whoisactive는 매우 멋진 도구입니다. 쿼리를 클릭 할 수있는 방식을 좋아하십시오
Sam Saffron

2

HT가 좋은지 나쁜지는 고정하기가 어렵습니다.

실제로 경험과 독서에 따라 서버로드 패턴에 따라 다릅니다. 즉, 성능에 영향을 줄 때 나쁘게 작동합니다 . 그렇지 않으면 눈치 채지 못합니다.

내가 읽은 이론은 스레드가 캐시를 공유한다는 것인데, 이는 불리한 조건에서 각 스레드가 다른 스레드의 캐시를 덮어 쓸 수 있음을 의미합니다. 병렬 처리가 많지 않거나 부하가 많은 짧은 쿼리 인 경우 영향을 미치지 않을 수 있습니다.

MAXDOP과 프로세서 선호도 (SQL Server 2000의 마지막 실제 DBA 역할로 돌아 가기)를 사용해 보았지만 결정적인 것을 찾을 수는 없었습니다.

빠른 테스트로 물리적 코어 (낮은 숫자) 만 사용하고 발생하는 상황을 확인하도록 프로세서 선호도를 설정할 수 있습니다.

그러나 기껏해야 코어의 절반을 잃습니다. 요즘은 몇 년 전 2 대 4 또는 4 대 8 일 때 놀고 있었던 것과 비교하여 중요하지 않을 수 있습니다. 이제 8 대 16 또는 16 대 32입니다.

편집 : Slava Oks의 테스트


코어 0-3이 물리적이고 4-7이 논리적입니까? 그게 어떻게 작동합니까? 우리는 말할 수 없었고, 알려줄 도구를 찾지 못했습니다 ..
Jeff Atwood

2
@ Jeff Atwood : 나중에 더 찾을 것입니다. 나는 지금 .... 어딘가에 읽어 support.microsoft.com/kb/322385
GBN

그 KB 기사는 거의 요약합니다.
pauska

KB 기사에 유용한 정보가 포함되어 있지만 논리 프로세서가 실제 프로세서에 정확히 어떻게 매핑되는지에 대한 Jeff의 질문에 직접 대답하지는 않습니다. 내 두뇌는 반쯤 튀겨졌지만,이 인텔 기사에서 매핑을 파악하는 데 필요한 정보를 얻을 수 있기를 바랍니다. software.intel.com/en-us/articles/… 또한 software.intel.com/en-us/ 관련 링크가있는 blogs / 2009 / 12 / 21 /…
BradC

@Jeff Atwood, @BradC : Lordy, 찾기 힘들다. 참조 : 인텔 권장 사항에 의존합니다. SQL Server는 기본 Windows 열거 형 download.microsoft.com/download/5/7/7/…을 사용 합니다.
gbn

2

불행히도, 나는 "하이퍼 스레딩을 끄고 그것이 도움이되는지 확인"보다 더 확실한 답을 얻지 못할 것이라고 생각합니다.

내 원래 스레드 (귀하의 질문에 링크)에서 Jonathan의 도움이되었지만, 조사중인 특정 서버에 대한 HT의 영향에 대한 확실한 증거를 얻을 수 없었습니다. 필자의 경우 서버는 이미 교체 일정이 잡 혔기 때문에 교체를 위해 "문제를 처리"하도록했습니다.

나의 충고:

서버 레벨 MAX 병렬 처리 수준 설정 1을 시도하십시오 . SQL의 병렬 처리는 어쨌든 더 크고 더 오래 실행되는 쿼리에 가장 유용하며, 부하 (어쨌든)는 어쨌든 엄청나게 많은 수의 작은 쿼리로 구성됩니다. 이것은 CXPACKET 대기를 완전히 제거해야합니다. 이로 인해 특정 개별 쿼리가 약간 더 길어질 수 있지만 서버에서 더 많은 "처리량"이 가능합니다.

OLTP 서버 에서이 작업을 수행 한 결과가 좋았습니다. 다른 종류의 서버 (보고 서버, 처리 서버, 데이터웨어 하우징)에는 MAXDOP를 더 높게 설정해야합니다.

그리고 분명히이 설정은 SQL이 JOIN의 각 개별 테이블에 대해 여러 스레드를 사용할 수 있도록 허용하므로 병렬 처리를 완전히 제거하지는 않습니다.

이 설정 변경 사항은 즉시 적용되며 SQL 서비스를 다시 시작할 필요가 없으므로 시도해 볼만한 가치가 있습니다. http://msdn.microsoft.com/en-us/library/ms181007.aspx
이는 전환 할 수 있음을 의미합니다. 상황이 나 빠지기 시작하면 즉시 되돌려집니다.

BIOS에서 하이퍼 스레딩을 끄려면 전체 서버 재부팅이 필요하므로 조금 더 위험합니다.


0

기록상으로, 우리는 서버 업그레이드 후 예기치 않게 성능이 떨어졌습니다. BIOS 및 CPU 절전 문제로 인한 것으로 나타났습니다. 서버 (HP)의 기본 설정은 CPU 속도의 OS 제어를 무시하고 자체 알고리즘을 사용하는 것입니다. 이것을 OS 제어로 변경하고 BIOS를 업데이트하면 크게 개선되었습니다. 성능이 가장 낮은 상태에서 CPU를 잠그는 BIOS 버그가 있다는 릴리스 노트 (지금은 찾을 수 없음)가있었습니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.