OS X Server: 성능 평가

본 문서에서는 스크립트로 Mac OS X Server 10.4 이후 버전을 실행하는 서버에 대한 성능 평가를 시작하는 방법에 대해 설명합니다. 이 성능 평가의 주요 핵심은 CPU, 디스크 저장 공간 및 네트워킹과 같은 주요 리소스의 활용을 식별하는 것입니다.

리소스 활용

'top_guide.pl'이라고 하는이 Perl 스크립트로 서버에서 시간의 흐름에 따른 주요 리소스의 활용을 평가할 수 있습니다. 이 스크립트는 Mac OS X Server 10.4 이후 버전에서 사용할 수 있습니다.

스크립트는 top -d를 실행하지만 시간의 흐름에 따라 주요 리소스의 활용을 추출하고 요약합니다. 인수가 없으면 top_guide.pl의 출력 결과는 다음과 유사합니다.

--------  -----------  ------------  -------------  -------------  -------------  -------------  ------
          CPU usage:          300-s  Reads/sec:     Writes/sec:    Net in/sec:    Net out/sec:   kernel
Time:     user  sys    Idle   avg.   number MB      number MB      pkts   Mb      pkts   Mb      CPU%
--------  ----- -----  -----  -----  ------ ------  ------ ------  ------ ------  ------ ------  ------
08:44:36    0.1   0.1   99.8   99.8       0    0.0       0    0.0      11    0.0       0    0.0     0.4
08:44:46    0.1   0.3   99.6   99.8       0    0.0       0    0.1      12    0.0       0    0.0     0.4
08:44:56    0.0   0.2   99.8   99.8       0    0.0       0    0.0      17    0.0       0    0.0     0.4
08:45:06    0.0   0.2   99.8   99.8       0    0.0       0    0.0       6    0.0       0    0.0     0.4
08:45:16    0.0   0.2   99.8   99.8       0    0.0       0    0.0       9    0.0       0    0.0     0.4
08:45:26    8.7  24.6   66.7   98.6      43    0.8      98    0.6     803    1.0    1399    1.1     5.0
08:45:37    5.7  83.6   10.7   95.7      48    0.4    1085  116.9   95366 1053.1   61830   35.4    72.4
08:45:47   11.5  88.5    0.0   92.4      23    0.2    3228  426.9  337955 3843.6  207872  114.0   284.8
08:45:58    4.6  95.4    0.0   89.0       4    0.0     594  596.7  447499 5215.5  266449  140.9   370.0

식별된 세 가지 주요 영역인 CPU, 디스크 I/O 및 네트워킹을 확인할 수 있습니다. 열은 다음을 의미합니다.

  • 시간: 최근 요약 행의 종료 시간입니다. 기본적으로 샘플 간 간격은 10초입니다.
  • CPU 사용: 사용자: 사용자 모드의 CPU 사용량입니다. 해당 값은 이 시스템에서 사용할 수 있는 총 CPU 리소스의 백분율입니다. 예를 들어 8 프로세서 시스템에서 사용자 CPU 50%는 모든 실행 중인 응용 프로그램에 대한 총 CPU 활용이 프로세서 4개에 해당한다는 것을 의미합니다.
  • CPU 사용: sys: 사용 가능한 총 CPU에 대한 백분율로 표시된 커널 모드의 CPU 사용량입니다.
  • 유휴: 사용 가능한 총 리소스에 대한 백분율로 표시된 유휴 CPU입니다.
  • 300-s avg: 최근 300초 동안 사용하지 않은 CPU에 대한 평활 평균 백분율입니다. '-r' 옵션으로 평균 간격을 조정하면 열 제목이 적절하게 변경됩니다.
  • 읽기/초 - 수: 샘플 기간 동안 발행된 고유한 디스크 읽기 연산의 수입니다.
  • 읽기/초 - MB: 샘플 기간 동안 해당 디스크에서 읽는 총 메가바이트입니다.
  • 쓰기/초 - 수: 샘플 기간 동안 발행된 고유한 쓰기 연산의 수입니다.
  • 쓰기/초 - MB: 샘플 기간 동안 읽는 총 메가바이트입니다.
  • 네트워크 입력/초 - pkts :샘플 기간 동안 수신하는 총 패킷입니다.
  • 네트워크 입력/초 - Mb: 샘플 기간 동안의 총 네트워크 입력(단위: 초당 메가비트)입니다.
  • 네트워크 출력/초 - pkts: 샘플 기간 동안 보내는 총 네트워크 패킷입니다.
  • 네트워크 출력/초 - Mb: 샘플 기간 동안의 총 네트워크 출력(단위: 초당 메가비트)입니다.

스크립트가 제공하는 기타 옵션은 다음과 같습니다.

  • -h: 디스플레이 총 사용량 정보입니다.
  • -o filename: 탭으로 구분된 출력 사본을 파일에 놓습니다. 이 출력 양식은 스프레드시트 또는 기타 데이터 분석 스크립트로 가져오는 데 적합합니다. 첫 번째 행에는 출력이 항상 자기 설명적이도록 하는 열 헤더가 포함됩니다.
  • -d: 날짜 및 시간 스탬프를 표시합니다. 이는 특히 관리자가 기록 작성을 원하는 서버에 장기적으로 기록하는 데 유용합니다.
  • -S processNames: 단일 인스턴스 프로세스를 모니터링합니다. 이는 단일 프로세스 ID만 있는 특정 서비스가 서버에 특별히 관련된 경우 유용합니다. 예는 주로 AFP 서버로 사용되는 서버일 수도 있습니다. 그러한 경우 인수 -S AppleFileServer를 사용하여 AppleFileServer 프로세스의 사용자 CPU 사용에 대한 별도의 열을 추가합니다. 쉼표로 프로세스 이름을 구분하여 둘 이상의 프로세스를 나열할 수 있습니다
  • -M processNames-S와 마찬가지로 응용 프로그램에서 여러 프로세스를 사용하는 경우 사용에서 제외됩니다. 예로 smbd를 들 수 있는데, 연결마다 하나씩 있습니다. Samba에 많이 사용되는 시스템에서 -M smbd를 사용하여 모든 Samba 활동에 대한 사용자 CPU를 요약하는 열을 가져옵니다.

본 문서에서는 서버 성능에 대한 완전한 분석을 다루지 않지만 top_guide.pl의 출력은 시스템의 CPU, 디스크 및 네트워크 리소스 사용량에 대한 요약을 제공합니다. 하드웨어 및 시스템 로드와 비교하면 관리자가 어떤 영역을 자세하게 조사할지 정할 수 있습니다. 각 영역을 조사하는 경우 도움이 될 수 있는 일부 추가 도구가 아래에 설명되어 있습니다.

CPU 활용

CPU 활용이 높으면 조사의 주요 방향성을 응용 프로그램의 효율성을 개선하는 데 두어야 합니다. 이 부분에 대해서는 본 문서에서 다루지 않지만 종종 CPU는 사용되지 않습니다. 더 많은 용량을 로드하는 데 사용할 수 있는 디스크 리소스와 충분한 네트워크가 있지만 상당한 양의 CPU가 유휴 상태로 남아 있는 상황을 조사하는 데 도움이 되는 몇 가지 도구를 이용할 수 있습니다.

다음은 CPU가 충분히 사용되지 않을 수 있는 두 가지 상황입니다.

  • 응용 프로그램 스레드 잠금
  • 커널 리소스 잠금

Mac OS X 10.5 Leopard에 도입된 plockstat(1) 명령을 특정 응용 프로그램에 대해 실행하여 pthread 잠금 경합을 조사할 수 있습니다. 상황 전환이 많은(CSW 열) 프로세스에 대한 top -d 출력을 조사하여 pthread 잠금 경합이 있을 수도 있는 프로세스를 식별할 수 있습니다. pthread 잠금 경합을 조사하려는 프로세스를 식별했으면 다음을 사용합니다. # plockstat -C -e 10 -p <pid>.

 Mutex block
   
   Count     nsec Lock                       Caller
   -------------------------------------------------------------------------------
  8540    29622 0x805eb0                     a.out`process_request+0x3d1
  8361    28284 0x805eb0                     a.out`release_block+0xac
  
 R/W reader block
 
 Count     nsec Lock                         Caller
 -------------------------------------------------------------------------------
     1  3014987 0xa781e8                     a.out`key_find+0x121
     5    78831 0xa3d158                     a.out`key_find+0x121
     2   120532 0xa3d158                     a.out`key_delete+0x137
 
 R/W writer block
 
 Count     nsec Lock                         Caller
 -------------------------------------------------------------------------------
    10  5336318 0xa781e8                     a.out`key_replace+0x80
    13  3827632 0xa75fe8                     a.out`key_replace+0x80
     3  3644946 0xa5fde8                     a.out`key_create+0x37
     6   161055 0xa3d158                     a.out`key_replace+0x80
     1   785267 0xa37758                     a.out`key_create+0x37

이 출력을 검사하고 여러 잠금 하에 차단된 총 nsec의 양을 검토할 수 있습니다. 이 값이 전체를 기준으로 봤을 때 높으면 실행 시간이 잠금 경합에 의해 영향을 받습니다. 이 정보는 응용 프로그램 개발자가 응용 프로그램의 성능을 가려내고 개선하는 데 도움이 될 수 있습니다. 기호를 사용할 수 있는 경우에는 발신자 필드에 차단된 함수에 대한 기호 이름이 포함됩니다. 또한 전체 차단 수가 높아 초당 약 250을 넘으면 스레드 간 예약 상태를 변경하는 데 있어 다소 효율성이 떨어집니다. 성능을 제한하는 요소라고 결론을 내리기에는 충분하지 않지만 대부분의 경우 응용 프로그램이 효율적이지 않을 수 있음을 나타내기 때문에 높은 수준의 차단이 조사에 신빙성을 부여합니다.

리소스 경합 문제가 커널 내 리소스에 대한 문제인 경우도 있습니다. Mac OS X 커널은 커널 뮤텍스 및 읽기/쓰기 잠금으로 대부분의 다중 스레드 리소스를 관리합니다. 뮤텍스 경합은 다음과 같은 dtrace(1M) 스크립트를 통해 평가될 수 있습니다.

lockstat:::adaptive-block

{

        @often[arg0, stack(5)] = count();

}


profile:::tick-5sec

{

        normalize(@often, 5);

        printa(@often);

}

이는 샘플링 5초 후 프린트된 각 출력 차단의 하단에서 가장 경합이 심한 잠금 및 경로를 사용하여 정렬된 목록을 프린트합니다. 출력 샘플은 다음과 같습니다.

        375517140

              mach_kernel`lck_mtx_lock_wait_x86+0x1c7

              mach_kernel`lck_mtx_lock+0x217

              mach_kernel`ip_output_list+0xd34

              mach_kernel`tcp_setpersist+0x18b

              mach_kernel`tcp_output+0x17a0

                0

        375571960

              mach_kernel`lck_mtx_lock_wait_x86+0x1c7

              mach_kernel`lck_mtx_lock+0x217

              mach_kernel`vnode_ref+0x32

              mach_kernel`fcntl_nocancel+0x4b3

              mach_kernel`unix_syscall64+0x26d

                0

이러한 경우에는 스크립트에서 375517140의 커널 뮤텍스가 tcp_output()이 tcp_setpersist()를 호출(이로 인해 ip_output_list()가 호출됨)하는 경로를 통해 차단된다고 보고합니다. 초당 차단 수는 이러한 잠금 모두에서 0이므로 잠금 경합은 문제가 되지 않습니다. 스크립트의 이 형식은 단일 잠금에 대한 모든 인스턴스의 총 합계가 아닙니다. 스크립트가 다음과 같이 변경되었다면

lockstat:::adaptive-block

{

        @often[arg0] = count();

}


profile:::tick-5sec

{

        normalize(@often, 5);

        printa(@often);

}

출력이 다음과 같이 변경될 수 있습니다.

       1301055072                9

       1417504384                9

        353318336               10

        359381776               10

       1301055088               11

          5387344              165

이는 커널 주소 5387344의 잠금에만 상당한 경합이 있음을 나타내는 것으로, 이와 같은 경우에도 250 미만이므로 문제가 되지 않습니다.

마지막으로 스크립트를 다음과 같이 약간 변경하여 커널 읽기/쓰기 잠금에 중점을 둘 수 있습니다.

lockstat:::rw-block

{

    @often[arg0, stack(4)] = count();

}


profile:::tick-5sec

{

    normalize(@often, 5);

    printa(@often);

    clear(@often);

}

다음은 dtrace(1M) lockstat 스크립트 및 plockstat(1) 사용에 대해 몇 가지 기억해야 할 사항입니다.

  • 잠금 통계를 수집하면 성능에 영향을 미칩니다. 이러한 도구는 시스템 속도를 느리게 할 수도 있습니다. 이 도구를 주의해서 실행하고 성능 영향이 정상 작동에는 없는 경합을 추가한다는 점에 명심하십시오.
  • 일부 설계는 잠금 차단만으로는 영향을 받지 않습니다. 아주 천천히 변경되는 리소스에 대한 잠금을 고려합니다. 리소스를 관리하도록 잠금 사용을 선택할 수도 있습니다. 잠금이 장기 실행 중인 작업이 완료되기를 기다리면서 남아 있을 수도 있습니다.

이러한 인스턴스는 장시간 대기 상태가 되어 실제로는 성능을 저하시키지 않을 수도 있습니다.

디스크 활용

iopending(1) 은 대기열 심도의 히스토그램과 같이 I/O 대기열 심도의 증상을 보여 줍니다. 예는 다음과 같습니다.

2008 May 21 10:35:26,  load: 0.99,  disk_r:      0 KB,  disk_w:    392 KB
           value  ------------- Distribution ------------- count   
             < 0 |                                         0       
               0 |@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 9298    
               1 |                                         12      
               2 |                                         5       
               3 |                                         4       
               4 |                                         2       
               5 |                                         3       
               6 |                                         2       
               7 |                                         2       
               8 |                                         3       
               9 |                                         2       
              10 |                                         3       
              11 |                                         2       
              12 |                                         2       
              13 |                                         2       
              14 |                                         2       
              15 |                                         0       

이는 일부 디스크 동작을 나타내지만 거의 모든 I/O 대기열의 심도는 0이 아니므로 문제가 되지 않습니다. 또한 iopending 을 사용하여 특정 디스크 또는 파일 시스템 볼륨에 중점을 둘 수도 있습니다. 예를 들어 /Volumes/MyRAID에 중점을 두려면 iopending -m MyRAID를 사용합니다.

마지막으로 I/O를 특정 프로세스의 결과로 보고 fs_usage(1)를 사용하여 대기 시간을 평가할 수 있습니다. Shark 및 fs_usage(1) 사용에 대한 자세한 내용은 이 개발자 경합 문서에서 확인할 수 있습니다.

네트워크 활용

대부분의 서버에는 여러 네트워크 인터페이스 및 네트워크 전체에 걸쳐 다양한 거리상에 있는 클라이언트가 있을 수 있습니다. 그렇기 때문에 성능 분석이 복잡할 수 있습니다. 그러나 클라이언트가 알려진 속도의 패브릭 전체에 직접 연결되는 경우 top_guide.pl 및 netstat -i 에서 보고하는 기준은 용량이 어떤 식으로 최대한 활용되고 있는지에 대한 유용한 정보를 제공합니다. 이러한 숫자를 해석할 때 다음 지침에 유념하십시오.

기가비트 네트워크 - 전이중, 1500바이트 MTU
최대 속도 - 소규모 패킷:    1488Kpps   762Mbps
최대 패킷 속도 - 1500바이트 패킷:  81Kpps   987Mbps
(Kpps = 초당 수천 개의 패킷)

네트워크 성능 분석 시 과도한 패킷 재전송 비율(본 문서의 범위에 속하지 않음)과 같은 문제에 대한 netstat -s 출력을 검토하는 것도 유용합니다.

더 알아보기

Apple이 제조하지 않은 제품에 관한 정보 또는 Apple의 관리 또는 테스트 대상이 아닌 독립적인 웹 사이트는 권장 또는 보증 없이 제공되는 것입니다. Apple은 타사 웹 사이트 또는 제품에 대한 선택, 성능, 사용과 관련하여 발생하는 결과에 대해 책임을 지지 않습니다. Apple은 타사 웹 사이트의 정확성 또는 신뢰도에 대해 어떠한 언급도 하지 않습니다. 인터넷을 사용하는 데는 위험이 따르기 마련입니다. 자세한 내용은 공급업체에 문의하십시오. 기타 회사 및 제품 이름은 각 소유자의 상표일 수 있습니다.

게시일: