Skip to Content
Infra & DevOpshtop의 UID·사용자 이름 조회 방식 살펴보기
☁️ Infra & DevOps2016년 10월 18일

htop의 UID·사용자 이름 조회 방식 살펴보기

#linux#java#system-programming#htop#monitoring#bigdata

프로세스의 사용자 정보를 표시할 때 UID를 이름으로 바꾸는 방법을 찾아보며 htop의 UsersTable.c를 참고했습니다. 당시 메모에 남아 있는 핵심은 사용자 정보를 조회할 때마다 같은 작업을 반복하지 않고, UID별로 이름을 보관하는 구조였습니다.

UID와 계정 정보 조회

UID는 사용자 계정을 식별하는 숫자입니다. 이름으로 표시하려면 시스템의 계정 데이터베이스에서 해당 UID를 조회해야 합니다.

C의 getpwuid는 UID에 해당하는 계정 정보를 반환합니다. 계정 정보의 출처는 시스템 설정에 따라 달라질 수 있으므로 /etc/passwd 파일만 읽는 함수로 이해하면 범위를 놓칠 수 있습니다.

htop의 캐시 구조

당시 참고한 코드는 먼저 해시테이블에서 UID를 찾았습니다. 이름이 없다면 getpwuid를 호출하고, 결과가 있으면 이름을 복사해 해시테이블에 넣었습니다. 다음 조회에서는 저장된 이름을 재사용할 수 있습니다.

흐름을 의사 코드로 적으면 다음과 같습니다.

text
캐시에서 UID의 이름 조회 → 있으면 그 이름 반환 → 없으면 시스템 계정 정보 조회 → 계정이 있으면 이름을 복사해 저장하고 반환 → 계정이 없으면 조회 실패 처리

구현은 htop 1.0.3의 UsersTable.c 에서 볼 수 있습니다. 당시 기록과 같은 방식의 코드를 확인하기 위한 버전 링크입니다.

다른 수집기에 적용할 때의 고려 사항

이 구조를 Java 등의 수집기에 적용한다면 UID와 이름의 매핑을 저장하는 부분과 실제 계정 조회 방법을 나눠 생각할 수 있습니다.

오래 실행하는 수집기라면 계정 이름 변경이나 UID 재사용 시 캐시를 언제 갱신할지도 정해야 합니다. 찾지 못한 UID를 어떻게 표시할지와 재시도 방법도 필요합니다.

여러 스레드에서 호출한다면 조회 함수와 반환 데이터의 수명도 확인해야 합니다. getpwuid가 반환한 내부 저장 영역을 계속 보관하는 방식과, 이름을 복사해 보관하는 방식은 다릅니다. 스레드별 버퍼를 사용하는 getpwuid_r도 이런 차이를 확인하며 사용할 수 있습니다.

참고 자료

Last updated on