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