ESXi에서 PCI-E 장치 정보를 확인하는 방법은 여러 가지가 있다. Linux 사용자라면 아주 익숙할 lspci
명령어와, esxcli hardware pci list
가 대표적이다.
하지만, 두 명령어 모두 Linux의 lspci 명령어가 보여주는 것 만큼 자세한 정보를 보여주지는 않는다.
예를 들어, ESXi에서 lspci 명령어를 치면 다음과 같은 결과가 나온다.
[그림 1. ESXi의 lspci 출력 (non-verbose)]
여기에서 얻을 수 있는 정보는 디바이스명과 PCI-E Bus ID가 전부이다.
좀 더 자세한 정보를 확인하기 위해 lspci -p
명령어를 사용하면 다음과 같은 결과를 얻을 수 있다.
[그림 2. ESXi의 lspci 출력 (pciinfo)]
디바이스명이 사라진 대신, VID/DID/SVID/SDID와 인터럽트 정보 등을 확인할 수 있다. 그리고 해당 장치에 매핑된 vmkmodule 정보도 볼 수 있다.
그렇다면, lspci -v
는 어떨까?
[그림 3. ESXi의 lspci 출력 (verbose)]
Verbose 옵션을 사용하면 PCI Bus ID, 디바이스명, PCI Class ID와 Class Sub ID를 확인할 수 있다.
어느 쪽이든 Linux의 lspci -vvv
가 제공하는 만큼 디테일한 정보를 얻을 수는 없다.
esxcli hardware pci list
명령어는 lspci
명령어의 출력을 사람이 읽기 좋은 텍스트 형태로 보여준다.
하지만, 마찬가지로 PCI-E 장치 자체의 자세한 정보를 확인할 수는 없다.
[그림 4. ESXi의 esxcli hardware pci list 출력]
나는 트러블슈팅을 위해 특정 장치의 Actual Link Speed를 확인하고 싶은데, 이럴 때는 어떻게 해야 할까?
VSISH를 이용하면, VMKernel이 가지고 있는 장치 정보를 가져올 수 있다.
PCI-E 장치의 정보는 /hardware/pci
에 있으며, 장치 지정 방식은 다음과 같은 규칙을 따른다.
seg/<segment ID>/bus/<bus ID>/slot/<slot ID>/func/<PF ID>/
Segment ID와 Bus ID, Slot ID, PF (Physical Function) ID는 lspci
또는 esxcli hardware pci list
를 통해 얻을 수 있으며, VSISH에서는 다음과 같은 정보를 get/set 할 수 있다.
그리고 각 ID 값이 16진수가 아닌 10진수이기 때문에, HEX to DEC 변환이 필요하다.
[그림 5. VSISH를 이용해 get/set 할 수 있는 PCI-E 장치 정보]
위 항목 중, 나에게 필요한 것은 capList이다. 해당 구조체에는 특정 PCI-E 장치가 가지고 있는 PCI Capability 정보가 담겨 있을 것이기 때문이다.
[그림 6. PCI Capablities 예시 (출처)]
PCI-SIG의 PCI CODE AND ID ASSIGNMENT SPECIFICATION 문서에서 사전 정의된 PCI Capability ID를 확인할 수 있다.
개중에서 나에게 필요한 것은 10h, PCI Express Capability이다. 이 필드에 PCI-E 버전과 링크 속도가 기록되기 때문이다.
[그림 7. VSISH를 이용한 PCI Express Capability 쿼리 예시]
VSISH에서 임의의 PCI-E 장치를 선택한 뒤, Cap ID 16을 쿼리해 보았다.
해당 장치는 PCI-E 4.0 4배속의 최대 대역폭을 가지지만, 실제로는 PCI-E 3.0 4배속의 속도로 동작하고 있음을 확인할 수 있다.
lspci, esxcli로 얻을 수 없는 PCI-E 장치에 대한 자세한 정보를 VSISH를 통해 확인할 수 있다.
필요할 경우 vsish를 직접 사용하여 해당 장치가 지원하는 모든 Capability / Extended Capability 정보를 확인해 볼 수 있을 것이며, 만약 PCI-E 링크 속도 정보가 필요하다면 해당 정보가 담긴 Capability ID가 16 (0x10)임을 기억해 두면 좋을 것이다.
한 가지 팁을 주면, lspci에서 보여지는 PCI Bus ID 값은 Segment_ID:Bus_ID:Slot_ID.PF_ID
의 꼴을 가진다.
이 정보와 vsish -e
를 조합하면 특정 PCI 장치의 원하는 상태값을 shell에서 바로 가져올 수 있다.
[그림 8. vsish -e 를 이용한 PCI Express Capability의 직접 쿼리 예시]
이 글이 비슷한 이슈를 겪고 있는 다른 사람들에게 도움을 줄 수 있기를 바란다.