DEVSTAT(3)

명칭
devstat, getnumdevs, getgeneration, getversion, checkversion, getdevs, selectdevs, buildmatch, compute_stats, compute_etime - 디바이스 통계 유틸리티 프로그램 라이브러리

프로그램 라이브러리
libdevstat

서식
<sys/dkstat.h> <devstat.h> int getnumdevs(void) long getgeneration(void) int getversion(void) int checkversion(void) int getdevs(struct statinfo *stats) int selectdevs(struct device_selection **dev_select, int *num_selected, int *num_selections, long *select_generation, long current_generation, struct devstat *devices, int numdevs, struct devstat_match *matches, int num_matches, char **dev_selections, int num_dev_selections, devstat_select_mode select_mode, int maxshowdevs, int perf_select) int buildmatch(char *match_str, struct devstat_match **matches, int *num_matches) int compute_stats(struct devstat *current, struct devstat *previous, long double etime, u_int64_t *total_bytes, u_int64_t *total_transfers, u_int64_t *total_blocks, long double *kb_per_transfer, long double *transfers_per_second, long double *mb_per_second, long double *blocks_per_second, long double *ms_per_transaction) long double compute_etime(struct timeval cur_time, struct timeval prev_time)

해설
devstat 프로그램 라이브러리는, 커널 devstat(9) 인터페이스를 처리하는데 편리한 함수의 프로그램 라이브러리입니다. 커널 devstat(9) 인터페이스는, sysctl(3) 에 의해 유저가 액세스 할 수 있습니다.

getnumdevs() (은)는, 커널내의 devstat 하부조직에 등록되었다 디바이스의 수를 돌려줍니다.

getgeneration() (은)는, 커널내의 디바이스 devstat 리스트의 현재의 세대를 돌려줍니다.

getversion() (은)는, 현재의 커널 devstat 디바이스 버젼을 돌려줍니다.

checkversion() (은)는, 커널 devstat 버젼에 대해서 유저 랜드 devstat (을)를 체크합니다. 2 개(살)이 동일한 경우, 0 이 돌려주어집니다. 그렇지 않은 경우는, devstat_errbuf 에 해당하는 에러를 표시해 -1 를 돌려줍니다.

getdevs() (은)는, 디바이스와 통계의 현재의 리스트를 꺼내, 지정되었다 statinfo 구조에 넣습니다. statinfo 구조는 <devstat.h> 에 있습니다.

    struct statinfo {
    	long		cp_time[CPUSTATES];
    	long		tk_nin;
    	long		tk_nout;
    	struct devinfo	*dinfo;
    	struct timeval	busy_time;
    };

getdevs() (은)는, statinfo 구조를 할당할 수 있는 것을 기대해, 또, getdevs() 의 기동 전에 dinfo 서브 엘리먼트를 할당할 수 있어 0 으로 초기화되는 일도 기대합니다. dinfo 서브 엘리먼트는, 호출이라고 불러 방편의 사이 상태를 격납하기 위해서 사용되어 최초의 getdevs() 호출의 뒤에는 변경해 되지 않습니다. dinfo 서브 엘리먼트에는 다음의 엘리먼트가 들어가 있습니다.

    struct devinfo {
    	struct devstat	*devices;
    	u_int8_t	*mem_ptr;
    	long		generation;
    	int		numdevs;
    };

kern.devstat.all sysctl 변수에는, devstat 구조의 배열이 들어가 있습니다만, 배열의 선두는 현재의 devstat 세대입니다. 세대가 버퍼의 선두에 있는 이유는, devstat 통계에 액세스 하고 있는 유저 랜드 소프트웨어가 자동적으로 통계 정보 및 대응하는 세대 번호의 양쪽 모두를 불가분에 얻도록(듯이) 하기 (위해)때문입니다. 클라이언트 소프트웨어가 다른 sysctl 변수 (이것은 편의를 위해서(때문에) 이용할 수 있습니다)를 통해서 세대 번호를 얻는 것을 강제당했을 경우, 디바이스의 리스트는, 클라이언트가 세대를 얻을 때 각과 클라이언트가 디바이스 리스트를 얻을 때 각의 사이에 변화할 가능성이 있습니다.

devinfo 구조의 mem_ptr 서브 엘리먼트는, 할당해진 메모리를 가리키는 포인터이며, 필요하면, getdevs() 에 의해 사이즈가 변경됩니다. devinfo 구조의 디바이스 서브 엘리먼트는 기본적으로, kern.devstat.all sysctl 변수로부터 devstat 구조의 배열의 선두를 가리키는 포인터입니다. devinfo 구조의 세대 서브 엘리먼트에는, kern.devstat.all sysctl 변수로부터의 세대 번호가 포함되어 있습니다. devinfo 구조의 numdevs 서브 엘리먼트에는, 커널 devstat 하부조직에서 등록된 디바이스의 현재의 번호가 들어가 있습니다.

selectdevs() (은)는, 규준의 수를 기초로 해 표시하는 디바이스를 선택합니다.

지정 디바이스
    지정된 디바이스는 최초의 선택 우선 순위입니다. 이것들은, 일반적으로, 유저에 의해 이름에 의해 지정된 디바이스, 예를 들어, da0, da1, cd0 입니다.

매치 패턴
    이러한 패턴 유저 입력으로부터 buildmatch() 에 의해 생성된 패턴 매칭식입니다.

성능  성능 모드가 유효한 경우, 디바이스는, selectdevs() 에게 건네진다 device_selection 구조내의 bytes 필드를 기초로 해 정렬 됩니다. bytes 값은, 현시점에서는, 유저가 메인트넌스할 필요가 있습니다. 장래적으로는, 이것은 devstat 프로그램 라이브러리 routine로 행해질 가능성이 있습니다. 디바이스가 이름 또는 패턴에 의해 선택되어 있지 않은 경우, 성능 추적 코드가 시스템내의 각 디바이스를 선택해, 이것들을 성능에 의해 정렬 합니다. 디바이스가 이름 또는 패턴에 의해 선택되고 있는 경우, 성능 추적 코드는 이러한 선택을 존중해, 선택된 디바이스의 사이에만 정렬 합니다.

devstat 리스트내의 순서
    선택 모드가 DS_SELECT_ADD 로 설정되어 게다가 maxshowdevs 미만의 디바이스가 선택되고 있는 경우, selectdevs() 하지만 자동적으로 maxshowdevs 디바이스를 셋업 합니다.

selectdevs() (은)는, 다음의 4 개의 모드로 선택을 실시합니다.

DS_SELECT_ADD
    추가 모드로, selectdevs() (은)는, 이름 또는 일치 패턴에 의해 지정되었다 선택되어 있지 않은 디바이스를 선택합니다. 또, 이것은 devstat 의 순서로 한층 더 디바이스를 선택합니다. 선택한 디바이스의 수가 maxshowdevs 에 동일해질 때까지, 또는 모든 디바이스가 선택될 때까지입니다.

DS_SELECT_ONLY
    only 모드로, selectdevs() (은)는, 현재의 선택사항을 모두 클리어 해, 이름 또는 일치하는 패턴으로 지정된 디바이스만을 선택합니다.

DS_SELECT_REMOVE
    제거 모드로, selectdevs() (은)는, 이름 또는 일치 패턴에 의해 지정된 디바이스를 제거합니다. 추가 디바이스는 선택하지 않습니다.

DS_SELECT_ADDONLY
    추가만 모드로, selectdevs() (은)는, 이름 또는 일치한다 패턴으로 지정된 선택되지 않는 디바이스를 선택합니다. 이 점에서는, 이것은 추가 모드와 동일합니다. 그러나, 지정된 이외의 디바이스는 선택하지 않습니다.

모든 선택 모드로, selectdevs() (은)는, maxshowdevs 디바이스를 넘는 디바이스는 선택하지 않습니다. 1 개의 예외는, “top” 모드에 있어, 디바이스가 선택되어 있지 않을 때입니다. 이 경우, selectdevs() (은)는, 시스템내의 각 디바이스 (을)를 선택합니다. 클라이언트 프로그램은, 특정의 디바이스에 주위를 기울이는지 어떤지 결정할 때, 선택의 순서에 주위를 기울일 필요가 있습니다. 이것은 안된다 동작이며, 한층 더 고려할 필요가 있다고 생각됩니다.

selectdevs() (은)는, 클라이언트에 의해 건네받았다 dev_select 구조의 할당과 사이즈 변경을 처리합니다. selectdevs() (은)는, numdevs 필드와 current_generation 필드를 사용해, 현재의 devstat 세대와 디바이스의 수를 추적합니다. num_selections 하지만 numdevs (와)과 같지 않은 경우, 또는 select_generation 하지만 current_generation (와)과 같지 않은 경우, selectdevs() (은)는, 선택 리스트를 필요에 따라서 사이즈 변경해, 선택 배열을 다시 초기화합니다.

buildmatch() (은)는, 콤마로 단락지어진 일치 string를 취해, selectdevs() 하지만 이해한다 devstat_match 구조에 컴파일 합니다. 일치 string의 형식은 다음과 같습니다.

    device, type, if

buildmatch() (은)는, 필요에 따라서, 일치 리스트의 할당과 재할인 맞히고를 처리합니다. 현시점에서 기존의 일치 타입에는 다음의 것이 포함됩니다.

디바이스 타입:
    da  다이렉트 액세스 디바이스
    sa  시퀸셜 액세스 디바이스
    printer
        프린터
    proc
        프로세서 디바이스
    worm
        기입 1 회 독해 복수 디바이스 (Write Once Read Multiple devices)
    cd  CD 디바이스
    scanner
        스캐너 디바이스
    optical
        광학 메모리데바이스
    changer
        매체 변경 (Medium Changer) 디바이스
    comm
        통신 디바이스
    array
        스토리지 배열 디바이스
    enclosure
        포위 서비스 디바이스 (Enclosure Services devices)
    floppy
        플로피 디바이스

인터페이스:
    IDE 통합 드라이브 전자 공학 디바이스 (Integrated Drive Electronics devices)
    SCSI
        소형 컴퓨터 시스템 인터페이스 디바이스
    other
        다른 디바이스 인터페이스

파스스르:
    pass
        파스스르데바이스

compute_stats() (은)는, 다양한 디바이스 통계를 얻기 위한 간단한 방법입니다. current (와)과 etime 의 2 개의 인수가 필수입니다. 다른 각 인수는 옵션입니다. 대부분의 어플리케이션의 경우, 유저는 current (와)과 previous 의 devstat 구조의 양쪽 모두를 지정하고 싶다고 생각하는 것입니다. 지정 기간에 걸쳐 통계가 계산할 수 있도록(듯이) 하기 위한(해)에입니다. 인스턴스에 따라서는, 시스템 기동으로부터의 통계를 계산하기 위해서, 유저는 previous 의 인수에 대해 NULL 포인터를 건네주는 일이 있습니다. 그 경우, compute_stats() (은)는, current 의 구조내의 합계 상태를 사용해, etime 시간에 걸치는 통계를 계산합니다. compute_stats() 하지만 계산할 가능성이 있는 각종 통계는, 함수 선언 자체로 주로 설명한다 필요가 있습니다만, 완전성을 기하기 위해서(때문에), 변수명의 리스트와 거기에 넣을 수 있다 통계를 나타냅니다.

total_bytes
    previous 의 취득과 current 의 취득동안에서, 독해와 기입의 양쪽 모두가, 지정 디바이스로 전송 되는 바이트의 합계수입니다. previous 하지만 NULL 의 경우, 결과는 current 그리고 주어지는 합계의 독해와 기입입니다.

total_transfers
    previous 의 취득과 current 의 취득동안에서 완료되는 전송의 합계수입니다. 이전이 NULL 의 경우, 결과는 current 안에 리스트 되는 트랜잭션(transaction)의 합계수입니다.

total_blocks
    기본적으로 total_bytes (을)를 디바이스 블록 사이즈로 제산한 것입니다. 블록 사이즈가 ‘0’ (으)로서 리스트 되고 있는 경우, 디바이스 블록 사이즈는, 디폴트로 512 바이트가 됩니다.

kb_per_transfer
    측정 기간의 사이의 전송마다의 평균 KB 수입니다.

transfers_per_second
    초 마다의 전송의 평균수입니다.

mb_per_second
    초 마다의 평균 MB 입니다.

locks_per_second
    초 마다의 평균 블록입니다. 디바이스 블록 사이즈가 ‘0’ 의 경우, 디폴트의 블록 사이즈 512 바이트가 대신에 사용됩니다.

ms_per_transaction
    트랜잭션(transaction)마다의 평균 밀리 세컨드수입니다.

compute_etime() (은)는, 2 개(살)의 timeval 구조동안의 초단위의 차이를 검출하는 간단한 방법입니다. 이것은, getdevs() 함수 ( statinfo 구조 체내 )가, 현재의 devstat 리스트를 꺼낼 때마다, getdevs() 함수가 기록했을 때 각과 함께 가장 일반적으로 사용됩니다.

반환값
getnumdevs(), getgeneration() , 및 getversion() (은)는, 지시받은 sysctl 변수를 돌려줍니다. 변수를 꺼낼 때 에러가 있었을 경우는 -1 을 돌려줍니다.

checkversion() (은)는, 커널과 유저 랜드 devstat 버젼이 일치하는 경우, 0 을 돌려줍니다. 일치하지 않는 경우, -1 를 돌려줍니다.

getdevs() (와)과 selectdevs() (은)는, 에러의 경우는 -1 을 돌려주어, 에러가 없는 경우는 0 을 돌려주어, 디바이스 리스트 또는 선택한 디바이스가 변화하고 있는 경우는 1 을 돌려줍니다. getdevs() (으)로부터의 반환값이 1 인 것은, selectdevs() 의 재실행의 힌트입니다. 디바이스 리스트가 변화하고 있기 때문입니다.

buildmatch() (은)는 에러의 경우는 -1 , 에러가 없는 경우는 0 을 돌려줍니다.

compute_stats() (은)는 에러의 경우는 -1 , 성공의 경우는 0 을 돌려줍니다.

compute_etime() 계산 끝난 경과시간을 돌려줍니다.

devstat 프로그램 라이브러리 함수의 1 개로부터 에러가 돌려주어졌을 경우, 일반적으로, 에러의 이유가 글로벌 string devstat_errbuf 에 인쇄됩니다. devstat_errbuf 의 길이는 DEVSTAT_ERRBUF_SIZE 캐릭터입니다.

관련 항목
systat(1), iostat(8), rpc.rstatd(8), vmstat(8), devstat(9)

역사
devstat 통계 시스템은 최초로 FreeBSD 3.0 에 나타났습니다.

저자
Kenneth Merry <ken@FreeBSD.org>

버그
getdevs(), selectdevs() , 및 buildmatch() 에 의해 할당해진 메모리를 할당 해제하기 위한 인터페이스가 아마 있을 것입니다.

selectdevs() (은)는, 디바이스가 이전에 선택되어 있지 않은 경우, “top” 모드에서는, maxshowdevs 디바이스보다 대부분을 선택하는 것은 아마 할 수 없습니다.

이 프로그램 라이브러리의 대부분의 클라이언트에 대해 행해지는 통계 버퍼 스왑 (을)를 실행하기 위한 함수가 아마 있을 것입니다.

statinfo 구조와 devinfo 구조는, 클린 업 해, 좀 더 생각할 필요가 있습니다.