Go to main content
Oracle® VM Server for SPARC 3.4 관리 설명서

인쇄 보기 종료

업데이트 날짜: 2016년 8월
 
 

인터럽트 제한 조정

하드웨어는 한정된 수의 인터럽트를 제공하므로 Oracle Solaris는 각 장치가 사용할 수 있는 인터럽트 수를 제한합니다. 기본 제한은 표준 시스템 구성 요구에 맞아야 하지만, 특정 시스템 구성에 따라 이 값을 조정해야 할 수도 있습니다.


주 - 이러한 제한 사항은 SPARC M7 시리즈 서버와 SPARC T7 시리즈 서버에 적용되지 않습니다.

PCIe 버스에서 I/O 가상화를 사용으로 설정하면 각 I/O 도메인에 인터럽트 하드웨어 리소스가 지정됩니다. 이들 중 한정된 수의 리소스만 각 도메인에 할당되므로 인터럽트 할당 문제가 발생할 수 있습니다. 이 상황은 UltraSPARC T2, UltraSPARC T2 Plus, SPARC T3, SPARC T4, SPARC T5, SPARC M5, SPARC M6 플랫폼에만 영향을 줍니다.

Oracle Solaris 콘솔에 표시된 다음 경고는 I/O 장치 드라이버를 연결하는 동안 인터럽트 공급이 소진되었음을 의미합니다.

WARNING: ddi_intr_alloc: cannot fit into interrupt pool

특히, 시스템이 여러 논리적 도메인으로 분할된 경우와 너무 많은 I/O 장치가 게스트 도메인에 지정된 경우 제한 조정이 필요합니다. Oracle VM Server for SPARC는 인터럽트 총수를 더 작은 세트로 나누어 게스트 도메인에 지정합니다. 너무 많은 I/O 장치가 게스트 도메인에 지정된 경우 각 장치에 기본 인터럽트 제한을 제공하기에는 인터럽트 공급량이 너무 작을 수 있습니다. 따라서 게스트 도메인이 모든 드라이버를 완전히 연결하기 전에 인터럽트 공급량을 소진합니다.

일부 드라이버는 Oracle Solaris OS에서 자동으로 인터럽트를 조정할 수 있도록 선택적 콜백 루틴을 제공합니다. 이러한 드라이버에는 기본 제한이 적용되지 않습니다.

::irmpools::irmreqs MDB 매크로를 사용하여 인터럽트가 어떻게 사용되는지 확인합니다. ::irmpools 매크로는 전체 인터럽트 공급량을 풀로 나눈 값을 보여줍니다. ::irmreqs 매크로는 각 풀에 매핑된 장치를 보여줍니다. 각 장치에 대해 ::irmreqs는 선택적 콜백 루틴에 의해 기본 제한이 강제 적용되는지 여부, 각 드라이버가 요청한 인터럽트 수, 각 드라이버가 소유한 인터럽트 수를 보여줍니다.

이 매크로에 연결을 실패한 드라이버에 대한 정보는 표시되지 않지만 이 정보를 바탕으로 어느 정도까지 기본 제한을 조정할 수 있는지 계산할 수 있습니다. 콜백 루틴을 제공하지 않고 여러 개의 인터럽트를 사용하는 장치의 경우 기본 제한을 조정하여 더 적은 인터럽트를 사용하도록 강제할 수 있습니다. 해당 장치에서 기본 제한을 줄이면 다른 장치에서 사용할 인터럽트를 확보할 수 있습니다.

기본 제한을 조정하려면 /etc/system 파일에서 ddi_msix_alloc_limit 등록 정보를 1 - 8 범위의 값으로 설정합니다. 그런 다음 시스템을 재부트하여 변경사항을 적용합니다.

/etc/system 등록 정보 값을 정확히 만들거나 업데이트하는 방법은 /etc/system 파일에서 등록 정보 값 업데이트를 참조하십시오.

성능을 최대화하려면 큰 값을 지정하여 시작했다가 시스템이 경고 없이 성공적으로 부트할 때까지 증분 값을 조금씩 줄입니다. ::irmpools::irmreqs 매크로를 사용하여 값 조정이 모든 연결된 드라이버에 미치는 영향을 측정합니다.

예를 들어, 게스트 도메인에서 Oracle Solaris OS를 부트하는 동안 다음 경고가 발생한다고 가정합니다.

WARNING: emlxs3: interrupt pool too full.
WARNING: ddi_intr_alloc: cannot fit into interrupt pool

::irmpools::irmreqs 매크로는 다음 정보를 보여줍니다.

# echo "::irmpools" | mdb -k
ADDR             OWNER   TYPE   SIZE  REQUESTED  RESERVED
00000400016be970 px#0    MSI/X  36    36         36

# echo "00000400016be970::irmreqs" | mdb -k
ADDR             OWNER   TYPE   CALLBACK NINTRS NREQ NAVAIL
00001000143acaa8 emlxs#0 MSI-X  No       32     8    8
00001000170199f8 emlxs#1 MSI-X  No       32     8    8
000010001400ca28 emlxs#2 MSI-X  No       32     8    8
0000100016151328 igb#3   MSI-X  No       10     3    3
0000100019549d30 igb#2   MSI-X  No       10     3    3
0000040000e0f878 igb#1   MSI-X  No       10     3    3
000010001955a5c8 igb#0   MSI-X  No       10     3    3

이 예제에서 기본 제한은 장치당 8개 인터럽트이며, 마지막 emlxs3 장치까지 시스템에 연결하기에 인터럽트가 부족합니다. 모든 emlxs 인스턴스가 같은 방법으로 작동한다고 가정하면, emlxs3은 8개 인터럽트를 요청했을 것입니다.

총 풀 크기인 36개 인터럽트에서 모든 igb 장치에서 사용된 12개 인터럽트를 빼면 emlxs 장치에 24개 인터럽트를 사용할 수 있습니다. 24개 인터럽트를 4로 나누면 장치당 6개 인터럽트가 모든 emlxs 장치를 같은 성능으로 연결할 수 있을 것입니다. 따라서 다음 조정이 /etc/system 파일에 추가됩니다.

set ddi_msix_alloc_limit = 6

/etc/system 등록 정보 값을 정확히 만들거나 업데이트하는 방법은 /etc/system 파일에서 등록 정보 값 업데이트를 참조하십시오.

시스템이 경고 없이 성공적으로 부트하면 ::irmpools::irmreqs 매크로는 다음 업데이트된 정보를 보여줍니다.

primary# echo "::irmpools" | mdb -k
ADDR             OWNER   TYPE   SIZE  REQUESTED  RESERVED
00000400018ca868 px#0    MSI/X  36    36         36
 
# echo "00000400018ca868::irmreqs" | mdb -k
ADDR             OWNER   TYPE   CALLBACK NINTRS NREQ NAVAIL
0000100016143218 emlxs#0 MSI-X  No       32     8    6
0000100014269920 emlxs#1 MSI-X  No       32     8    6
000010001540be30 emlxs#2 MSI-X  No       32     8    6
00001000140cbe10 emlxs#3 MSI-X  No       32     8    6
00001000141210c0 igb#3   MSI-X  No       10     3    3
0000100017549d38 igb#2   MSI-X  No       10     3    3
0000040001ceac40 igb#1   MSI-X  No       10     3    3
000010001acc3480 igb#0   MSI-X  No       10     3    3