kstat¸¦ ÀÌ¿ëÇÑ ½Ã½ºÅÛ Á¤º¸ ȹµæ
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Contents

1 Âü°í ¸µÅ©
2 kstat library¿¡ ´ëÇÑ ¼Ò°³
3 kstat¸¦ ÅëÇÑ Ä¿³Î Á¤º¸ ¼öÁý
3.1 kstat ¸í·ÉÀ» ÅëÇÑ ÀÚ¿ø È®ÀÎ
3.2 kstat Á¤º¸ ±¸¼º ±¸Á¶
4 ¿¹Á¦
4.1 CPU ÀϹÝÁ¤º¸ ¼öÁý
5 Kstat Lib ·¹ÆÛ·±½º
5.1 ¼Ò°³
5.2 Data Structure Overview
5.3 ÁÖ¿ä ¸â¹ö
5.4 kstatÀÇ »ç¿ë
5.5 Data Types
5.6 Accumulated Time and Queue Length Statistics
5.7 Dealing with Chain Update
5.8 Putting It All Together

1 Âü°í ¸µÅ©

2 kstat library¿¡ ´ëÇÑ ¼Ò°³

kstat library ´Â Solaris¿î¿µÃ¼Á¦¿¡¼­ Ä¿³ÎÀÇ ¿©·¯°¡Áö Åë°èÁ¤º¸¿¡ Á¢±ÙÇϱâ À§ÇÑ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇϸé cpu, memory, ÀÔÃâ·ÂÀåÄ¡(interface, fd, hdd, scsi, nfs¿Í °°Àº ³×Æ®¿öÅ© ÆÄÀϽýºÅÛ)¿¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸µéÀ» ¾òÀ» ¼ö ÀÖ´Ù.

Linux¿î¿µÃ¼Á¦ÀÇ /procÆÄÀϽýºÅÛÀ» ÅëÇØ¼­ ¾òÀ» ¼ö ÀÖ´Â ½Ã½ºÅÛÁ¤º¸µéÀ» kstat ¶óÀ̺귯¸®¸¦ ÅëÇØ¼­ ¾òÀ» ¼ö ÀÖ´Ù°í º¸¸é µÈ´Ù.

3 kstat¸¦ ÅëÇÑ Ä¿³Î Á¤º¸ ¼öÁý

3.1 kstat ¸í·ÉÀ» ÅëÇÑ ÀÚ¿ø È®ÀÎ

Solaris´Â ½Ã½ºÅÛÁ¤º¸¸¦ ¸ð´ÏÅ͸µÇϱâ À§ÇÑ ½Ã½ºÅÛ °ü¸®ÀÚ¸¦ À§ÇÑ kstat¶ó´Â ½Ã½ºÅÛ ¸í·ÉÀ» Á¦°øÇÑ´Ù.
  • ¿¹¸¦ µé¾î¼­ cpu Á¤º¸¸¦ È®ÀÎÇÏ±æ ¿øÇÑ´Ù¸é
kstat -c misc -m cpu_info 
module: cpu_info                        instance: 0 
name:   cpu_info0                       class:    misc                  
        chip_id                         0 
        clock_MHz                       900 
        cpu_type                        sparcv9 
        crtime                          52.0145272 
        device_ID                       14466993752290 
        fpu_type                        sparcv9 
        implementation                  UltraSPARC-III+ 
        snaptime                        2655206.9366932 
        state                           on-line 
        state_begin                     1113294756 
 
  • cpu »óÅÂÀÇ È®ÀÎÀ» ¿øÇÑ´Ù¸é
bash-2.03# kstat -c misc -m cpu_stat 
module: cpu_stat                        instance: 0 
name:   cpu_stat0                       class:    misc                  
        anonfree                        0 
        anonpgin                        2 
        anonpgout                       0 
        as_fault                        64729904 
        bawrite                         50410 
        bread                           4583 
        bwrite                          192990 
...... 
 
  • -c´Â ¾ò¾î¿À°íÀÚ ÇÏ´Â ½Ã½ºÅÛ Á¤º¸ÀÇ Å¬·¡½º(Ä«Å×°í¸®)ÀÌ´Ù.
  • -mÀº ¾ò¾î¿À°íÀÚ ÇÏ´Â ¸ðµâÀ̸§ÀÌ´Ù.
  • À̵é Ŭ·¡½º¿Í ¸ðµâ°ªÀº ½ÇÁ¦ kstat°ü·Ã ÇÔ¼ö¸¦ È£ÃâÇÒ¶§ µ¿ÀÏÇÑ À̸§À¸·Î »ç¿ëµÈ´Ù.

    // cpu_info ¸ðµâ¿¡ ÀÖ´Â Á¤º¸¸¦ Á¢±ÙÇϱâ À§ÇÑ kstat Æ÷ÀÎÅ͸¦ »ý¼ºÇÑ´Ù. 
    if((ksp = kstat_lookup(kc, "cpu_info", i, NULL)) ==NULL) 
         break; 
    // cpu_info ¸ðµâÀÇ Ç׸ñÁß¿¡ cpu_type Á¤º¸¸¦ ¾ò¾î¿Â´Ù. 
    knp = kstat_data_lookup(ksp, "cpu_type"); 
     
kstatÀÇ ½ÇÇà°á°ú Ãâ·ÂµÇ´Â module¿Í name¿Í ¼¼ºÎÇ׸ñµéÀº kstat lib¸¦ ÅëÇØ¼­ ¿øÇÏ´Â °ªÀ» °¡Á®¿À±â À§ÇÑ ±âÁØÁ¤º¸°¡ µÈ´Ù. kstat lib¸¦ ÅëÇØ¼­ Á¤º¸¸¦ °¡Á®¿À°í ½ÍÀ» ¶§, kstat¸í·ÉÀ» ¿ì¼±½ÇÇàÇØ¼­ ÇÊ¿äÇÑ module, name, ¼¼ºÎÇ׸ñÀ̸§À» ¾Ë°í³ª¸é Á»´õ ½±°Ô kstat lib¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

3.2 kstat Á¤º¸ ±¸¼º ±¸Á¶

À§ÀÇ kstat ¸í·É¾îÀÇ ½ÇÇà°á°ú¸¦ º¸¸é kstat°¡ ¾î¶°ÇÑ Á¤º¸ ±¸¼ºÀ» °¡Áö°í ÀÖ´ÂÁö ´ë·« ÀÌÇØ°¡ °¡´ÉÇÒ °ÍÀÌ´Ù. kstat´Â ´ÙÀ½°ú °°Àº 4´Ü°è µð·ºÅ丮 ±¸Á¶¸¦ °¡Áø´Ù.
            class      module         name      key  <------> value          
=================================================================== 
kernel  --+--net ----+-- eri ----+--- eri0 --+- bad_pkts     12987201 
kstat     |          |           |           +- brdcstrcv    872019 
±¸Á¶Ã¼    |          |           |           +- brdcstxmt    920 
          |          |           |           +- ..... 
          |          |           +--- eri1 
          |          | 
          |          +-- lo -----------------+- ipackets     1320160 
          |                                  +- opackets     1320160 
          | 
          +--disk ---+-- sd -----+--- sd6  --+- read 
                                             +- rtime 
          ...... 
 
class´Â ´ëÇ׸ñ, module´Â ¼ÒÇ׸ñ, nameÀº ½ÇÁ¦ Á¢±ÙÇϰíÀÚ ÇÏ´Â ÀåÄ¡ÀÇ À̸§À̰í, key´Â °¡Á®¿À°íÀÚ ÇÏ´Â °ªÀ» °¡¸®Å°´Â ¼º´ÉÀÇ À̸§ÀÌ´Ù. ¿¹¸¦µé¾î¼­ ÀÎÅÍÆäÀ̽º eri0¿¡ ÀÔ·ÂµÈ ÆÐŶÀÇ byte Á¤º¸¸¦ ¾ò±â¸¦ ¿øÇÑ´Ù¸é net > eri > eri0 > rbytes ¼øÀ¸·Î Á¢±ÙÀ» ÇÏ¸é µÈ´Ù.

ÀÌ·¯ÇÑ Á¢±ÙÀº solaris ¿î¿µÃ¼Á¦¿¡¼­ Á¦°øÇÏ´Â kstat library(ÀÌÇÏ kstatlib)¸¦ ÀÌ¿ëÇÏ°Ô µÈ´Ù.

4 ¿¹Á¦

4.1 CPU ÀϹÝÁ¤º¸ ¼öÁý

#include <kstat.h> 
#include <stdio.h> 
#include <inttypes.h> 
#define SLEEPTIME 10 
 
int main(int argc, char **argv) 
{ 
  kstat_ctl_t   *kc; 
  kstat_t       *ksp; 
  kstat_io_t     kio; 
  kstat_named_t *knp; 
  unsigned int i; 
 
  kc = kstat_open(); 
 
  i = 0; 
  while(1) 
  { 
    if((ksp = kstat_lookup(kc, "cpu_info", i, NULL)) ==NULL) 
      break; 
    kstat_read(kc, ksp, NULL); 
 
    /* lookup the CPU speed data record */ 
    knp = kstat_data_lookup(ksp, "clock_MHz"); 
    printf("CPU speed of system is %d\n", knp->value.i32); 
 
    /* lookup cpu type */ 
    knp = kstat_data_lookup(ksp, "cpu_type"); 
    printf("CPU type is %s\n", knp->value.c); 
 
    i++; 
  } 
} 
 

5 Kstat Lib ·¹ÆÛ·±½º

5.1 ¼Ò°³

Solaris kernelÀº module-specific statistics(ƯÁ¤¸ðµâÀÇ Åë°èÁ¤º¸)¸¦ ¿ÜºÎ¿¡ º¸³¾ ¼ö ÀÖµµ·Ï device driver¿Í ´Ù¸¥ kernel ¸ðµâµé¿¡ ´ëÇÑ ÇÔ¼ö¿Í ÀڷᱸÁ¶(data structure)¸¦ Á¦°øÇÑ´Ù. kstat À̶ó ÂüÁ¶µÇ´Â ÀÌ·¯ÇÑ ±¸Á¶´Â Solaris software(12) °³¹ßÀڵ鿡°Ô ´ÙÀ½°ú °°Àº »çÇ×À» Á¦°øÇÑ´Ù.
  • device driver¿Í ´Ù¸¥ kernel ¸ðµâµéÀ» À§ÇÑ Åë°è¸¦ º¸¿©ÁÖ´Â C-¾ð¾î ÇÔ¼ö
  • Á÷Á¢ kernel memory¸¦ ÀÐÀ» ÇÊ¿ä¾øÀÌ applicationÀÌ Solaris·ÎºÎÅÍ Åë°è µ¥ÀÌÅ͸¦ ¾ò¾î¿Ã ¼ö ÀÖ´Â C-¾ð¾î ÇÔ¼ö
  • ´ëÈ­½ÄÀ¸·Î ȤÀº ½© ½ºÅ©¸³Æ®¿¡¼­ Åë°è µ¥ÀÌÅÍ¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â Perl ±â¹Ý ¸í·É¾î ¶óÀÎ ÇÁ·Î±×·¥ÀÎ /usr/bin/kstat¸¦ Á¦°ø. (Solaris 8ºÎÅÍ Áö¿ø)

SolarisÀÇ libkstat ¶óÀ̺귯¸®´Â applicationÀÌ kstats¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â C-¾ð¾î ÇÔ¼ö¸¦ °¡Áö°í ÀÖ´Ù. À̵é ÇÔ¼öµéÀº ÇÁ·Î±×·¥ÀÌ root°¡ µÇµµ·Ï setuid¸¦ ¼³Á¤ÇؾßÇÒ Çʿ並 ¹æÁöÇϱâÀ§ÇØ kernel µ¥ÀÌÅÍ¿¡ ´ëÇÑ º¸¾È ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇϱâÀ§ÇØ °¡»óµð¹ÙÀ̽º(pseudo-device)ÀÎ /dev/kstatÀ» »ç¿ëÇÑ´Ù.

¸¹Àº °³¹ßÀÚµéÀÌ C ÇÁ·Î±×·¥À» ÅëÇØ kernel Åë°èÀÚ·á¿¡ Á¢±ÙÇÏ°í ½Í¾îÇϱ⠶§¹®¿¡, ÀÌ ±â»ç´Â libkstat¸¦ »ç¿ëÇÏ´Â °Í¿¡ ÃÊÁ¡À» µÐ´Ù. ÀÌ ±â»ç´Â data structre¿Í function¿¡ ´ëÇØ¼­ ¼³¸íÇϰí, ¿¹Á¦ library¸¦ óÀ½ »ç¿ëÇÏ´Â µ¶ÀÚµéÀ» À§ÇÑ »ùÇà Äڵ带 Á¦°øÇÑ´Ù.

5.2 Data Structure Overview

Solaris kernel Åë°èµéÀº kstat chainÀ̶ó´Â linked list ÀڷᱸÁ¶·Î ±¸¼ºµÇ¾îÀÖ´Ù. °¢°¢ÀÇ kstatÀº °øÅëÇì´õ¿µ¿ª(common header section)°ú ƯÁ¤ ŸÀÔº° µ¥ÀÌÅÍ ¿µ¿ª(type-specific data section)À» °¡Áø´Ù. ÀÌ chainÀº system boot ½Ã¿¡ ÃʱâÈ­ µÈ´Ù. ±×·¯³ª, Solaris´Â µ¿Àû¿î¿µÃ¼Á¦(Dynamic OS)À̸ç, ÀÌ chainÀº ½Ã°£ÀÇ °æ°ú¿¡ µû¶ó °è¼Ó º¯°æµÈ´Ù.

kstatÀÇ °¢ ¿£Æ®¸®µéÀº kernelÀÇ Çʿ信 ÀÇÇØ ½Ã½ºÅÛ¿¡ Ãß°¡µÇ°Å³ª »èÁ¦µÈ´Ù. ¿¹¸¦ µé¸é, µ¿Àû À籸¼º(Dynamic Reconfiguration)¹æ½ÄÀ» »ç¿ëÇÏ¿© ¿î¿µÇÏ´Â ½Ã½ºÅÛ¿¡ I/O board¿Í board¿¡ ºÙ¾îÀÖ´Â componentµéÀ» Ãß°¡ÇÏ´Â °æ¿ì »õ·Î ÀåÂøµÈ hard ware¿Í »óÈ£ÀÛ¿ëÇÏ´Â device driver¿Í ´Ù¸¥ kernel ¸ðµâµéÀÌ kstat chain¿¡ kstat entry¸¦ »ðÀÔÇÒ °ÍÀÌ´Ù.

±¸Á¶Ã¼ ¸â¹ö ks_data´Â kstatÀÇ µ¥ÀÌÅÍ ¼½¼ÇÀ» °¡¸®Å°´Â pointerÀÌ´Ù. raw, named, timer, interrupt, I/O¿Í °°Àº ´Ù¾çÇÑ µ¥ÀÌÅÍ Å¸ÀÔµé(Multiple data types)ÀÌ Áö¿øµÈ´Ù. À̵éÀº Data Types.¿¡ ¼³¸íµÇ¾î ÀÖ´Ù.

Example 1 - kstat Header Structure from /usr/include/kstat.h
 typedef struct kstat {   
        /*       
         * Fields relevant to both kernel and user      
         */     
        hrtime_t       ks_crtime;               /* creation time */ 
        struct kstat  *ks_next;                 /* kstat chain linkage */ 
        kid_t          ks_kid;                  /* unique kstat ID */ 
        char           ks_module[KSTAT_STRLEN]; /* module name */ 
        uchar_t        ks_resv;                 /* reserved */ 
        int            ks_instance;             /* module's instance */ 
        char           ks_name[KSTAT_STRLEN];   /* kstat name */ 
        uchar_t        ks_type;                 /* kstat data type */ 
        char           ks_class[KSTAT_STRLEN];  /* kstat class */ 
        uchar_t        ks_flags;                /* kstat flags */ 
        void          *ks_data;                 /* kstat type-specific data */ 
        uint_t         ks_ndata;                /* # of data records */ 
        size_t         ks_data_size;            /* size of kstat data section */ 
        hrtime_t       ks_snaptime;             /* time of last data snapshot */ 
        /*      
         * Fields relevant to kernel only   
         */   
        int (*ks_update)(struct kstat *, int);   
        void           *ks_private;   
        int (*ks_snapshot)(struct kstat *, void *, int);   
        void           *ks_lock;   
      } kstat_t; 
 

5.3 ÁÖ¿ä ¸â¹ö

ks_crtime : kstatÀÌ Ã³À½ »ý¼ºµÈ ½Ã°£À» ³ªÅ¸³»°í ´Ù¾çÇÑ kernel counterµéÀÌ kstatÀÌ »ý¼ºµÈ ½Ã°£ºÎÅÍÀÇ rate ¸¦ °è»êÇÏ´Â °ÍÀ» Çã¿ëÇÑ´Ù. (¡°boot ÀÌÈÄ¡± ¶ó´Â ¸»Àº º¸´Ù ÀϹÝÀûÀÎ °³³ä¿¡ ÀÇÇØ ¡°kstat »ý¼º ÀÌÈÄ¡±¶ó´Â ¸»·Î ´ëÄ¡µÈ´Ù.) »ý¼º½Ã°£, ¸¶Áö¸· snapshot ½Ã°£, kstat_timer_t, kstat_io_t ŸÀÓ½ºÅÆÇÁ¿Í °°Àº kstats¿Í °ü·ÃµÈ ½Ã°£Àº 64ºñÆ® ³ª³ë¼¼ÄÁµå °ªÀ» °®´Â´Ù.

kstat ŸÀÓ½ºÅÆÇÁÀÇ Á¤È®µµ´Â ¸Ó½Å(machine)¸¶´Ù ´Ù¸£Áö¸¸ Á¤¹Ðµµ(precision)Àº ¸ðµç Ç÷§Æû¿¡ ´ëÇØ µ¿ÀÏÇÏ´Ù. high-resolution ŸÀÓ½ºÅÛÇÁ¿¡ ´ëÇÑ ÀϹÝÀûÀÎ Á¤º¸´Â gethrtime(3C)¿¡ ´ëÇÑ man page¸¦ ÂüÁ¶Ç϶ó.

ks_next : kstat´Â NULL-terminated·Î¼­ ¸µÅ©µå¸®½ºÆ® ȤÀº chain¿¡ ÀúÀåµÈ´Ù. ks_next´Â chain ³»ÀÇ ´ÙÀ½ kstatÀ» °¡¸®Å²´Ù.

ks_kid : kstatÀ» ½Äº°ÇÏ´Â ID (identifier)ÀÌ´Ù.

ks_module and ks_instance : kstatÀ» »ý¼ºÇÑ moduleÀÇ À̸§°ú instance ¹øÈ£¸¦ ´ã°íÀÖ´Ù. ´Ü ÇϳªÀÇ instance ¸¸ Á¸ÀçÇÏ´Â °æ¿ì ks_instance´Â 0ÀÌ´Ù. ´õ ¸¹Àº Á¤º¸´Â kstat Names¸¦ ÂüÁ¶Ç϶ó.

ks_names : kstat¿¡ ´ëÇÏ¿© ÀǹÌÀÖ´Â À̸§À» ºÎ¿©ÇÑ´Ù. kstatÀÇ namespace¿¡ ´ëÇÑ Ãß°¡ÀûÀÎ Á¤º¸´Â kstat Names¸¦ ã¾Æº¸¶ó

ks_types : kstat¿¡ ÀÖ´Â dataµéÀÇ typeÀÌ´Ù. data typeµéÀº Data Types¿¡¼­ ´Ù·é´Ù.

ks_class : °¢°¢ÀÇ kstatÀº bus, disk, net, vm, miscµî°ú °°Àº ¸î °³ÀÇ ³ÐÀº class·Î ±¸ºÐµÈ´Ù. ÀÌ field´Â ¼­·Î °ü·ÃµÈ kstatµéÀ» ²¨³»±â À§ÇÑ ÇÊÅÍ·Î½á »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ÀÇ °ªµéÀÌ ÇöÀç ¼Ö¶ó¸®½º¿¡¼­ »ç¿ëµÇ´Â °ÍµéÀÌ´Ù.
bus 
controller 
device_error 
disk 
hat 
kmem_cache 
kstat 
misc 
net 
nfs 
pages 
partition 
rpc 
ufs 
vm 
vmem 
 
ks_data, ks_ndata, and ks_data_size : ks_data ´Â kstatÀÇ data sectionÀ» °¡¸®Å°´Â pointerÀÌ´Ù. dataÀÇ typeÀº ks_type¿¡ µû¶ó ´Ù¸£°Ô ÀúÀåµÈ´Ù. ks_ndata´Â data recordÀÇ °³¼ö¸¦ ¶æÇÑ´Ù. ¸î¸î kstat typeµé¸¸ ´Ù¾çÇÑ(Multiple) data record¸¦ Áö¿øÇÑ´Ù. ¾Æ·¡ÀÇ kstatÀº ¿©·¯°³ÀÇ(multiple) data record¸¦ Áö¿øÇÑ´Ù.
KSTAT_TYPE_RAW 
KSTAT_TYPE_NAMED 
KSTAT_TYPE_TIMER 
 
¾Æ·¡ÀÇ kstatÀº ÇϳªÀÇ(one) data record¸¸À» Áö¿øÇÑ´Ù.
KSTAT_TYPE_INER 
KSTAT_TYPE_IO 
 
ks_data_size ´Â data sectionÀÇ total size¸¦ ³ªÅ¸³»¸ç byte ´ÜÀ§ÀÌ´Ù.

ks_snaptime : last data snapshot¿¡ ´ëÇÑ timestampÀÌ´Ù. À̰ÍÀº ¾Æ·¡ÀÇ °è»ê½Ä¿¡ ±â¹ÝÇÏ¿© activity rate¸¦ °è»êÇÒ ¼ö ÀÖ´Ù.
rate = (new_count - old_count) / (new_snaptime - old_snaptime) 
 

5.4 kstatÀÇ »ç¿ë

kstatÀ» »ç¿ëÇϱâ À§Çؼ­ programÀº ù ¹øÂ°·Î kstat_open()À» È£ÃâÇØ¾ß¸¸ ÇÑ´Ù. ¸®ÅϰªÀº kstat control ±¸Á¶Ã¼ÀÇ pointer ÀÌ´Ù.
kstat_open() 
kstat control structure¸¦ °¡¸®Å°´Â pointer¸¦ ¸®ÅÏÇÑ´Ù. 
 

Example 2 - kstat Chain Control Structure
typedef struct kstat_ctl {     
       kid_t     kc_chain_id;    /* current kstat chain ID */     
       kstat_t   *kc_chain;      /* pointer to kstat chain */     
       int       kc_kd;          /* /dev/kstat descriptor */    
   } kstat_ctl_t; 
 
kc_chainÀº kstat chainÀÇ º¹»çº»ÀÇ Çì´õ¸¦ °¡¸®Å²´Ù. º¸Åë Æ¯Á¤ kstatÀ» ã¾Æ ó¸®ÇϱâÀ§ÇØ chainÀ» ¼øÈ¸(walk)Çϰųª kstat_lookup()À» »ç¿ëÇÑ´Ù. kc_chain_id´Â kstat chainÀÇ º¹»çº»ÀÇ kstat chainÀ» ±¸ºÐÇÏ´Â ½Äº°ÀÚ(KCID ¶ó°í ÇÏ´Â)ÀÌ´Ù. À̵é(KCID)ÀÇ »ç¿ë¹ýÀº kstat Names¿¡¼­ ¼³¸íÇØ ³õ¾Ò´Ù.

kstat data¿¡ Á¢¼Ó½Ã ºÒÇÊ¿äÇÑ overhead¸¦ ÇÇÇϱâ À§ÇÏ¿© programÀº kstat chain¿¡¼­ ¿øÇÏ´Â Á¤º¸ÀÇ Å¸ÀÔÀ» ¸ÕÀú °Ë»öÇϰí. ±× ´ÙÀ½¿¡ kstat_read()¿Í kstat_data_lookup() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© kernel·ÎºÎÅÍ Åë°è(statistics)ÀڷḦ ¾ò¾î¿Â´Ù.

Example 3Àº disk I/O¿¡ ´ëÇÑ ¸ðµç Á¤º¸¸¦ ´ã°í ÀÖ´Â kstat entry¸¦ º¸¿©ÁÖ´Â code ÀÌ´Ù. ÀÌ ¿¹´Â chain Àüü¸¦ °Ë»öÇÏ¿© ks_typeÀÌ KSTAT_TYPE_IOÀÎ kstatÀ» ã°í, kstat_read()¸¦ È£ÃâÇÏ¿© data¸¦ °¡Á®¿Â ÈÄ¿¡ my_io_display()ÇÔ¼ö¸¦ È£ÃâÇÏ¿© ¾ò¾î¿Â data¸¦ ó¸®ÇÑ´Ù. ÀÌ ¿¹Á¦ ÇÔ¼öÀÇ ±¸ÇöÀº Example 9¿¡¼­ º¼ ¼ö ÀÖ´Ù.

Example 3 - Print kstat Entries with Disk I/O Information
kstat_ctl_t    *kc;   
kstat_t       *ksp;   
kstat_io_t     kio;   
 
kc = kstat_open();   
 
for (ksp = kc->kc_chain; ksp != NULL; ksp = ksp->ks_next) {   
  if (ksp->ks_type == KSTAT_TYPE_IO) {   
     kstat_read(kc, ksp, &kio);   
     my_io_display(kio);   
  }   
}   
 

5.5 Data Types

kstatÀÇ data sectionÀº ks_type field¿¡¼­ ½Äº°µÇ´Â 5°¡Áö typeÁß ÇϳªÀÇ Å¸ÀÔÀ» °®´Â´Ù. ´ÙÀ½ kstat typeµéÀº ¿©·¯ °³ÀÇ(multiple) data record¸¦ °¡Áö¸ç recordÀÇ °³¼ö´Â ks_ndata¿¡ µé¾îÀÖ´Ù.
KSTAT_TYPE_RAW 
KSTAT_TYPE_NAMED 
KSTAT_TYPE_TIMER 
 
data sectionÀÇ Àüü »çÀÌÁî´Â ks_data_size Çʵ忡¼­ ¾Ë ¼ö ÀÖÀ¸¸ç byte ´ÜÀ§ÀÌ´Ù.

KSTAT_TYPE_RAW
raw¡± kstat typeÀº byteÀÇ ¹è¿­(array)·Î Ãë±ÞµÇ°í ÀϹÝÀûÀ¸·Î vminfo(/usr/include/sys/sysinfo.h¿¡ Á¤ÀǵÊ) °°Àº well-known structure¸¦ ´ã±â(export)À§ÇØ »ç¿ëµÈ´Ù.

Example 4 - Dumping Out a Raw kstat
static void print_vminfo(kstat_t *kp)   
{   
      vminfo_t *vminfop;   
      vminfop = (vminfo_t *)(kp->ks_data);   
    
      printf("Free memory: %dn", vminfop->freemem);   
      printf("Swap reserved: %dn" , vminfop->swap_resv);   
      printf("Swap allocated: %dn" , vminfop->swap_alloc);   
      printf("Swap available: %dn", vminfop->swap_avail);   
      printf("Swap free: %dn", vminfop->swap_free);   
} 
 

KSTAT_TYPE_NAMED
ÀÌ kstat typeÀº ÀÓÀÇÀÇ name = value Åë°è(statistics) ¸®½ºÆ®¸¦ ÀúÀåÇϰí ÀÖ´Ù. Example 5´Â named kstatÀ» ´ã±â À§ÇØ »ç¿ëµÇ´Â ±¸Á¶Ã¼¸¦ º¸¿©ÁØ´Ù.

Example 5 - Named kstat Definitions from /usr/include/kstat.h
typedef struct kstat_named {   
     char name[KSTAT_STRLEN];         /* name of counter */   
     uchar_t data_type;               /* data type */   
     union {   
         char c[16];             /* enough for 128-bit ints */   
         int32_t i32;   
         uint32_t ui32;   
         int64_t i64;   
         uint64_t ui64;   
         /* These structure members are obsolete */   
         int32_t l;   
         uint32_t ul;   
         int64_t ll;   
         uint64_t ull;   
     } value;                  /* value of counter */   
 } kstat_named_t;   
   #define KSTAT_DATA_CHAR       0   
   #define KSTAT_DATA_INT32      1   
   #define KSTAT_DATA_UINT32     2   
   #define KSTAT_DATA_INT64      3   
   #define KSTAT_DATA_UINT64     4   
   /* These types are obsolete */   
   #define KSTAT_DATA_LONG       1   
   #define KSTAT_DATA_ULONG      2   
   #define KSTAT_DATA_LONGLONG   3   
   #define KSTAT_DATA_ULONGLONG  4   
   #define KSTAT_DATA_FLOAT      5   
   #define KSTAT_DATA_DOUBLE     6  
 
Example 9¿¡¼­´Â ÇÁ·Î±×·¥ÀÌ named kstatµéÀ» Ãâ·ÂÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁÖ±â À§ÇØ my_named_display()ÇÔ¼öÀÇ »ç¿ë¹ýÀ» º¸¿©ÁØ´Ù.

<!> ¸¸ÀÏ typeÀÌ KSTAT_DATA_CHAR À̶ó ÇÏ´õ¶óµµ, 16¹ÙÀÌÆ® value field(Áï, char ¹è¿­ÀÌ)ÀÌnull-terminatedµÈ´Ù°í º¸ÁõÇÒ ¼ö ¾ø´Ù. printf()¿Í °°Àº ÇÔ¼ö·Î value¸¦ Ãâ·ÂÇÒ ¶§ »ó±âÇØ¾ß ÇϹǷΠÀÌ »ç½ÇÀº Áß¿äÇÏ´Ù.

KSTAT_TYPE_TIMER
ÀÌ typeÀÇ kstatÀº event timer¿¡ ´ëÇÑ Åë°è¸¦ °®´Â´Ù. À̵éÀº ¾î¶°ÇÑ Å¸ÀÔÀÇ event¿¡ ´ëÇØ¼­µµ ±âº»ÀûÀÎ counting°ú timing¿¡ ´ëÇÑ Á¤º¸¸¦ Á¦°øÇÑ´Ù.
 Example 6 - Timer kstat Definitions from /usr/include/kstat.h 
 typedef struct kstat_timer {   
     char name[KSTAT_STRLEN];         /* event name */   
     uchar_t resv;                    /* reserved */   
     u_longlong_t num_events;         /* number of events */       
     hrtime_t elapsed_time;           /* cumulative elapsed time */   
     hrtime_t min_time;               /* shortest event duration */   
     hrtime_t max_time;               /* longest event duration */   
     hrtime_t start_time;             /* previous event start time */   
     hrtime_t stop_time;              /* previous event stop time */   
 } kstat_timer_t; 
  

KSTAT_TYPE_INTR
ÀÌ typeÀÇ kstatÀº interrupt Åë°è(statistics)Á¤º¸ÀÌ´Ù. interrupts ´Â ¾Æ·¡¿Í °°ÀÌ ºÐ·ùµÈ´Ù.
Interrupt Type Definition
Hard Çϵå¿þ¾î ÀåÄ¡¿¡ ÀÇÇØ ¹ß»ý
Soft ¸î¸î ½Ã½ºÅÛ ÀÎÅÍ·´Æ® sourceÀÇÇÑ ½Ã½ºÅÛ ÀÚü°¡ ¹ß»ýÇÏ´Â ÀÎÅÍ·´Æ®
Watching ÁÖ±âÀûÀÎ timer call¿¡ ÀÇÇØ ¹ß»ýÇÏ´Â ÀÎÅÍ·´Æ®
Spurious ÀÎÅÍ·´Æ® ¿£Æ®¸® Æ÷ÀÎÆ®¿¡ µé¾î°¡Áö¸¸ serviceÇÒ ÀÎÅÍ·´Æ®´Â ¾ø´Ù
Multiple Service ´Ù¸¥ ŸÀÔÀÇ ÀÎÅÍ·´Æ®Ã³¸®¸¦ ¸¶Ä¡±â Àü¿¡ ÀÎÅÍ·´Æ®°¡ ¸ÕÀú °¨ÁöµÇ°í ¼­ºñ½ºµÊ

Example 7 - Interrupt kstat Definitions from /usr/include/kstat.h 
#define KSTAT_INTR_HARD      0    
#define KSTAT_INTR_SOFT      1    
#define KSTAT_INTR_WATCHDOG  2    
#define KSTAT_INTR_SPURIOUS  3    
#define KSTAT_INTR_MULTSVC   4    
#define KSTAT_NUM_INTRS      5    
typedef struct kstat_intr {            
    uint_t intrs[KSTAT_NUM_INTRS]; /* interrupt counters */    
} kstat_intr_t; 
 

KSTAT_TYPE_IO
Example 8 - I/O kstat Definitions from /usr/include/kstat.h
typedef struct kstat_io {   
/*   
  * Basic counters.   
  */   
  u_longlong_t nread;    /* number of bytes read */   
  u_longlong_t nwritten; /* number of bytes written */   
  uint_t       reads;    /* number of read operations */   
  uint_t       writes;   /* number of write operations */   
  hrtime_t wtime;           /* cumulative wait (pre-service) time */   
  hrtime_t wlentime;        /* cumulative wait length*time product*/   
  hrtime_t wlastupdate;     /* last time wait queue changed */   
  hrtime_t rtime;           /* cumulative run (service) time */   
  hrtime_t rlentime;        /* cumulative run length*time product */   
  hrtime_t rlastupdate;     /* last time run queue changed */   
  uint_t wcnt;              /* count of elements in wait state */   
  uint_t rcnt;              /* count of elements in run state */   
} kstat_io_t; 
 

5.6 Accumulated Time and Queue Length Statistics

Time Åë°è(statistics)´Â ¡°active¡±timeÀÇ ½ÇÇà½Ã°£À» ÀüºÎ ´õÇÏ¿© ±¸ÇÑ´Ù. Queue length statistics´Â Å¥ÀÇ ±æÀÌ¿Í ±× ±æÀ̰¡ À¯ÁöµÈ ½Ã°£À» °öÇÑ °ªÀÇ ÃÑÇÕÀ¸·Î ¾ò´Â´Ù. ´Ù½Ã¸»ÇØ, Queue length¸¦ time¿¡ ´ëÇÏ¿© ÀûºÐÇÑ Riemann sumÀÎ °ÍÀÌ´Ù. °¢°¢ÀÇ »óÅÂ(queue ¿¡ µé¾î°¡°Å³ª queue ¹ÛÀ¸·Î ³ª°¡°Å³ª ÇÏ´Â)°¡ º¯ÇÒ ¶§ ¸¶´Ù ÀÌÀü »óÅÂÀÇ º¯È­·ÎºÎÅÍ °æ°úµÈ ½Ã°£ÀÌ active time¿¡ ´õÇØÁø´Ù.(¸¸ÀÏ ±× ½Ã°£ µ¿¾È queue length°¡ 0ÀÌ ¾Æ´Ï¶ó¸é)

°æ°úµÈ ½Ã°£°ú queue lengthÀÇ °öÀº ½Ã°£°ú °öÇØÁø ±æÀÌ(length)ÀÇ ÇÕ¿¡ ´õÇØÁø´Ù. ÇÁ·Ñ±×·¡¹Ö ÀûÀ¸·Î ¸»ÇÑ´Ù¸é
Stated programmatically:  
  
if (queue length != 0) {   
    time += elapsed time since last state change;   
    lentime +=  (elapsed time since last state change * queue length);   
} 
 
ÀÌ ¹æ¹ýÀº queue length ´ë½Å ¾î¶² Á¤ÀÇµÈ ½Ã½ºÅÛ(any define system)¿¡¼­ residecy¸¦ ÃøÁ¤ÇÏ´Â ÀϹÝÈ­µÈ ¹æ¹ýÀÌ µÉ ¼ö ÀÖ´Ù. Å¥ ±æÀÌ(Queue length)´ë½Å¿¡ ¡°outstanding RPC calls to server X¡±¸¦ »ý°¢Çغ¸ÀÚ. ´Ù¼öÀÇ I/O subsystemµéÀÌ ±×µéÀÌ °ü¸®ÇÏ´Â ÃÖ¼ÒÇÑ 2°³ÀÇ ±âº»ÀûÀÎ transaction list¸¦ °¡Áø´Ù.
  1. ó¸®(processing)°¡ ½ÃÀÛµÇÁø ¾Ê¾ÒÁö¸¸ 󸮵DZâ À§ÇØ AcceptµÈ Æ®·£Á§¼Ç ¸®½ºÆ®.
  2. ó¸®(proccessing)°¡ ¿Ï·áµÇÁö ¾ÊÀº ÇöÀç ó¸®ÁßÀÎ Æ®·£Àè¼Ç ¸®½ºÆ®
ÀÌ·±ÇÑ ÀÌÀ¯·Î µÎ °³ÀÇ ´©Àû time Åë°è°¡ Á¤ÀÇ µÈ´Ù.
  1. Pre-service time
  2. Service (run) time
°¢°¢ÀÇ ´©Àû½Ã°£Àº nanoseconds ·Î ¿¬»êµÈ´Ù.

Kstat Names
kstat namespace´Â kstat ±¸Á¶Ã¼¿¡¼­ 3°³ÀÇ field·Î Á¤ÀǵȴÙ.
ks_module 
ks_instance 
ks_name 
 
ÀÌ ¼¼ fieldÀÇ Á¶ÇÕÀº À¯ÀϼºÀ» º¸Àå¹Þ´Â´Ù.

¿¹¸¦ µé¾î 4°³ÀÇ FastEthernet Ä«µå¸¦ ÀåÂøÇÑ ½Ã½ºÅÛÀ» »ý°¢Çغ¸¶ó. SunÀÇ FastEthernet ÄÁÆ®·Ñ·¯¸¦ À§ÇÑ device driver moduleÀº ¡°hme"¶ó ºÒ¸°´Ù. ù ¹øÂ° ÀÌ´õ³Ý ÀÎÅÍÆäÀ̽º´Â instance0, µÎ ¹øÂ°´Â instance1, ... ÀÌ´Ù. "hme" driver´Â °¢ ÀÎÅÍÆäÀ̽º¸¶´Ù 2°¡Áö ŸÀÔÀÇ kstatÀ» Á¦°øÇÑ´Ù.
  1. ù ¹øÂ°´Â ¼º´É Åë°è(performancce statistics)¸¦ Æ÷ÇÔÇÏ´Â named kstatÀ̰í
  2. µÎ ¹øÂ°´Â interrupt Åë°è(statistics)¸¦ Æ÷ÇÔÇÑ´Ù.

ù ¹øÂ° interfaceÀÇ network Åë°è¿¡ ´ëÇÑ kstat data´Â ks_module == "hme", ks_instance == 0, ks_name == "hme0"¿¡¼­ ãÀ» ¼ö ÀÖ´Ù. interrupt Åë°è´Â ks_module == "hme", ks_instance == 0, ks_name == "hmec0" ¿¡ ÀÇÇØ ½Äº°µÇ´Â kstat¿¡¼­ ãÀ» ¼ö ÀÖ´Ù.

ÀÌ Example¿¡¼­ ks_name Çʵå(¡°hme0" and "hmec0¡±)¸¦ ¸¸µé±â À§ÇÑ module À̸§°ú instance ¹øÈ£ÀÇ Á¶ÇÕÀÌ µå¶óÀ̹öÀÇ À̸§ »ý¼º¹ýÀÌ´Ù. ´Ù¸¥ device driverµéµµ ¿©·¯°³ÀÇ kstat data typeµéÀ» »ý¼ºÇϱâ À§ÇØ À¯»çÇÑ ¸í¸í¹ýÀ» »ç¿ëÇÏÁö¸¸ ¹Ýµå½Ã ¿ä±¸µÇÁö´Â ¾Ê´Â´Ù. ÀÌ ¸ðµâÀº ±× Á¶ÇÕÀÌ À¯ÀÏÇØ¾ßÇÑ´Ù.

kernelÀÌ ¾î¶² kstatÀ» Á¦°øÇÏ´ÂÁö ¾Ë ¼ö ÀÖ´Â ¹æ¹ýÀº ¹«¾ùÀΰ¡?

°¡Àå ½¬¿î ¹æ¹ýÀº ,Solaris 8ÀÇ °æ¿ì¿¡, /usr/bin/kstatÀ» ÀÎÀÚ ¾øÀÌ ½ÇÇàÇÏ´Â °ÍÀÌ´Ù. ÀÌ ¹æ¹ýÀº ÇöÀçÀÇ °ÅÀÇ ¸ðµç kstat data¸¦ Ãâ·ÂÇÒ °ÍÀÌ´Ù. SolarisÀÇ kstat ¸í·ÉÀº °ÅÀÇ ¸ðµç ¾Ë·ÁÁø KSTAT_TYPE_RAW ŸÀÔÀÇ kstat¸¦ Ãâ·ÂÇÒ °ÍÀÌ´Ù.
Functions

´ÙÀ½ÀÇ ÇÔ¼öµéÀº kstat data¿¡ Á¢±ÙÇϱâÀ§ÇØ C program¿¡¼­ »ç¿ëµÈ´Ù
kstat_ctl_t *kstat_open(void); 
    : Ä¿³Î Åë°è ¶óÀ̺귯¸® (kernel statistics library)¿¡ ´ëÇÑ Á¢±ÙÇÏ´Â kstat Á¦¾î ±¸Á¶Ã¼¸¦ ÃʱâÈ­ÇÑ´Ù. 
  
¸®Åϰª : libkstat ÇÔ¼ö¿¡ kc argument·Î µé¾î°¡´Â kstat_ctl_t ±¸Á¶Ã¼¿¡ ´ëÇÑ pointer¸¦ ¸®ÅÏ ÇÑ´Ù. 
   ex) 
        kstat_ctl_t kc; 
        kc = kstat_open(); 
kstat_t *kstat_lookup(kstat_ctl_t *kc, char *ks_module, int ks_instance, char *ks_name) 
    : ÀÎÀÚ·Î µé¾î°¡´Â ks_module, ks_instance, ks_nameÀ» ¾Ë¾Æ³»±â À§ÇØ kstatÀÇ kstat chainÀ» °Ë»ö ÇÑ´Ù. 
 

¸¸ÀÏ, ks_module°¡ NULL, ks_instance°¡ -1, ks_name ÀÌ NULL À̸é ÀÌ fieldµéÀº ij¹«½ÃÇÑ´Ù. ¿¹¸¦ µé¾î kstat_lookup(kc, NULL, -1, "foo")´Â ´Ü¼øÈ÷ ¡°foo¡±¶ó´Â nameÀ» °®´Â kstat chainÀ» ãÀ» °ÍÀÌ´Ù.

void *kstat_data_lookup(kstat_t *ksp, char *name) : kstat data section¿¡¼­ ÁÖ¾îÁø À̸§(name)À» °¡Áø data record¸¦ ã´Â´Ù.
ÀÌ operationÀº named data record¸¦ °¡Áø kstat typeµé¿¡ ´ëÇØ¼­¸¸ È¿°úÀûÀÌ´Ù. ÇöÀç KSTAT_TYPE_NAMED¿Í KSATA_TYPE_TIMER typeÀÇ kstatµé ¸¸ÀÌ named data record¸¦ °¡Áö°í ÀÖ´Ù. ´ç½ÅÀº kernel·ÎºÎÅÍ data¸¦ ¾ò±â À§Çؼ­´Â kstat_read()¸¦ °¡Àå ¸ÕÀú È£ÃâÇØ¾ß¸¸ ÇÑ´Ù. ÀÌ·¯ÇÑ routineÀÌÈÄ¿¡ data section¿¡¼­ ƯÁ¤ data record¸¦ ã´Â´Ù.
  • kid_t kstat_read(kstat_ctl_t *kc, kstat_t *ksp, void *buf) : ƯÁ¤ kstatÀÇ data¸¦ kernel·ÎºÎÅÍ ¾ò´Â ÇÔ¼ö.
  • kid_t kstat_write(kstat_ctl_t *kc, kstat_t *ksp, void *buf) : kernel ³»ºÎÀÇ Æ¯Á¤ kstat¿¡ data¸¦ ¾²´Â ÇÔ¼ö. ´Ü superuser¸¸ÀÌ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
  • kid_t kstat_chain_update(kstat_ctl_t *kc) : kernelÀÇ header¿Í µ¿±âÈ­µÈ »ç¿ëÀÚÀÇ kstat header chainÀ» °¡Á®¿Â´Ù
  • int kstat_close(kstat_ctl_t *kc) : kstat control ±¸Á¶Ã¼¿Í ¿¬°üµÈ ¸ðµç ÀÚ¿øÀ» ÇØÁ¦ÇÑ´Ù. À̰ÍÀº exit(2)¿Í execve()Çϸé ÀÚµ¿À¸·Î ¼öÇàµÈ´Ù. º¸´Ù ¸¹Àº ÀÚ·á´Â exit(2)¿Í execve(), exec(2)ÀÇ man page¸¦ Âü°íÇ϶ó.

5.7 Dealing with Chain Update

Data Structure Overview¿¡¼­ ¾ð±ÞÇßµíÀÌ, kstat chainÀº ½Ã°£ÀÇ °æ°ú¿¡ µû¶ó µ¿ÀûÀ¸·Î º¯È­ÇÑ´Ù. libkstat ¶óÀ̺귯¸® ÇÔ¼ö kstat_open()Àº kernelÀÇ kstat chainÀÇ º¹»çº»À» ¸®ÅÏÇÑ´Ù. kernelÀÇ kstat chain()ÀÇ data´Â ¹Ù²ð ¼ö ÀÖÀ¸¹Ç·Î, ´ç½ÅÀÇ programÀº ´ç½ÅÀÇ kstat chain º¹»çº»ÀÇ ³»¿ëÀÌ kernelÀÇ kstat chain°ú ÀÏÄ¡ÇÏ´ÂÁö ¾Ë¾Æº¸±â À§ÇÏ¿© ÀûÀýÇÑ ¶§¿¡ kstat_chain_update()¸¦ È£Ãâ ÇØ¾ßÇÑ´Ù. ÀÌ °ÍÀÌ kstat Á¦¾î ±¸Á¶Ã¼¿¡ ÀÖ´Â kn_chain_in¿¡ ÀúÀåµÈ KCIDÀÇ ¸ñÀûÀÌ´Ù.

kernel moduleÀÌ systemÀÇ chainÀ¸·ÎºÎÅÍ kstatÀ» ´õÇϰųª »èÁ¦ÇÒ ¶§¸¶´Ù KCID´Â Áõ°¡µÈ´Ù. ´ç½ÅÀÇ programÀÌ kstat_chain_update()¸¦ È£ÃâÇϸé ÀÌ ÇÔ¼ö´Â ´ç½Å programÀÇ control structure¿¡ ÀÖ´Â kc_chain_id°¡ kernel¿¡ ÀÖ´Â °Í °ú matchÇÏ´ÂÁö üũÇÑ´Ù(Áï, »ç¿ëÀÚÀÇ KCID¿Í Ä¿³ÎÀÇ KCID°¡ °°ÀºÁö ºñ±³ÇÑ´Ù.) ¸¸ÀÏ kc_chain_id(KCID)°¡ ÀÏÄ¡ÇÏÁö ¾Ê´Â´Ù¸é kc_chain_update()´Â programÀÇ local kstatÀ» Ä¿³Î°ú ÀÏÄ¡Çϵµ·Ï rebuild ÇÏ°í ¾Æ·¡ÀÇ °ªÀ» return ÇÑ´Ù.
    - kc_chain_update()ÀÇ ¸®ÅÏ °ª 
          chainÀÌ update µÉ °æ¿ì »õ·Î¿î KCID »ý¼º 
          chain¿¡ º¯È­°¡ ¾ø´Ù¸é 0 
          ¾î¶°ÇÑ error°¡ ŽÁöµÈ´Ù¸é -1 
 
¸¸ÀÏ ´ç½ÅÀÇ programÀÌ ÀÌÀü¿¡ È£ÃâÇÑ kstat library ÇÔ¼öÀÇ ¾î¶² °ª(local data)À» ÀúÀå(cache)Çϰí ÀÖ´Ù¸é »õ·Î¿î KCID´Â ´ç½ÅÀÌ ÃÖ½ÅÀÇ(up-to-date) infomationÀ» °¡Áö°í ÀÖÀ½À» °¡¸®Å°´Â flag·Î¼­ ¿ªÇÒÀ» ÇÒ °ÍÀÌ´Ù. ´ç½ÅÀº ´ç½ÅÀÇ program¿¡ ÇÊ¿äÇÑ data°¡ Ãß°¡µÇ°Å³ª »èÁ¦µÇ¾ú´ÂÁö ¾Ë¾Æº¸±â À§Çشٽà chainÀ» °Ë»çÇÒ ¼ö ÀÖ´Ù.

½ÇÁ¦ÀûÀÎ ¿¹·Î iostatÀ̶ó´Â command°¡ ÀÖ´Ù. À̰ÍÀº ½Ã½ºÅÛ ³»ÀÇ disk¿¡ ´ëÇÑ ³»ºÎÀûÀÎ Á¤º¸(internal data)¸¦ ÀúÀåÇϰí ÀÖ´Ù°¡ disk°¡ on-line ȤÀº off-line µÇ¾ú´ÂÁö ÀνÄÇØ¾ßÇÒ Çʿ䰡 ÀÖ´Ù. ¸¸ÀÏ iostat°¡ interval argument¿Í ÇÔ²² È£ÃâµÈ´Ù¸é iostatÀº ÁÖ¾îÁø ¸Å¹ø interval second ¸¶´Ù I/OÅë°è¸¦ Ãâ·ÂÇÒ °ÍÀÌ´Ù. loop¸¦ ÅëÇÑ °¢ timeº°·Î ¾î¶² º¯È­°¡ ÀÖ´ÂÁö ¾Ë¾Æº¸±â À§ÇÏ¿© iostatÀº kstat_chain_update()¸¦ È£ÃâÇÑ´Ù. ¸¸ÀÏ º¯È­°¡ ÀÖ´Ù¸é device´Â Ãß°¡ ȤÀº »èÁ¦´ÂÁö ÆÄ¾ÇÇÑ´Ù.

5.8 Putting It All Together

´ç½ÅÀÇ C ProgramÀº ´ÙÀ½À» Æ÷ÇÔÇØ¾ß¸¸ ÇÑ´Ù.
 #include <kstat.h> 
 
ÇÁ·Î±×·¥ÀÌ lingkingµÉ ¶§ ÄÄÆÄÀÏ·¯ ¸í·É¶óÀÎÀº "-lkstat" ÀÎÀÚ¸¦ Æ÷ÇÔÇØ¾ß¸¸ ÇÑ´Ù.
cc -o print_some_kstats -lkstat print_some_kstats.c 
 

´ÙÀ½Àº ªÀº ¿¹Á¦ ProgramÀÌ´Ù. ù°, ÇÁ·Î±×·¥Àº kstat_lookup() ¿Í kstat_read()À» »ç¿ëÇÏ¿© systemÀÇ CPU speed¸¦ ¾Ë¾Æ³½´Ù. ±×¸®°í ¹«ÇÑ ·çÇÁ(infinite loop)¸¦ µ¹¸ç KSTAT_TYPE_IO ŸÀÔÀÇ ¸ðµç kstat¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ó¸¶°£ Ãâ·ÂÇÑ´Ù. ·çÇÁÀÇ ¸Ó¸®¿¡¼­ ´ç½ÅÀÌ current data¸¦ °¡Áö°í ÀÖ´ÂÁö üũÇϱâ À§ÇØ kstat_chain_update()¸¦ È£ÃâÇÑ °Í¿¡ ´ëÇØ ÀÎÁöÇ϶ó. ¸¸ÀÏ kstat chainÀÌ º¯°æµÇ¾ú´Ù¸é stderrÀ» ÅëÇØ ªÀº message¸¦ ÁÙ °ÍÀÌ´Ù.
 Example 9 - Sample Program to Print kstats of Different Types  
 /*  print_some_kstats.c:   
 *  print out a couple of interesting things   
 */   
 #include <kstat.h>   
 #include <stdio.h> 
 #include <inttypes.h> 
 #define SLEEPTIME 10   
    
 void my_named_display(char *, char *, kstat_named_t *);   
 void my_io_display(char *, char *, kstat_io_t);   
    
 main(int argc, char **argv)   
 {   
      kstat_ctl_t   *kc;   
      kstat_t       *ksp;   
      kstat_io_t     kio;   
      kstat_named_t *knp;   
    
      kc = kstat_open();   
    
      /*   
       * Print out the CPU speed. We make two assumptions here:   
       * 1) All CPUs are the same speed, so we'll just search for the   
       *    first one;   
       * 2) At least one CPU is online, so our search will always   
       *    find something. :)   
       */   
      ksp = kstat_lookup(kc, "cpu_info", -1, NULL);   
      kstat_read(kc, ksp, NULL);   
      /* lookup the CPU speed data record */   
      knp = kstat_data_lookup(ksp, "clock_MHz");    
      printf("CPU speed of system is ");   
      my_named_display(ksp->ks_name, ksp->ks_class, knp);   
      printf("n");   
    
      /* dump some info about all I/O kstats every   
         SLEEPTIME seconds  */   
      while(1) {   
         /* make sure we have current data */   
          if(kstat_chain_update(kc))   
              fprintf(stderr, "<<State Changed>>n");    
          for (ksp = kc->kc_chain; ksp != NULL; ksp = ksp->ks_next) {   
            if (ksp->ks_type == KSTAT_TYPE_IO) {   
               kstat_read(kc, ksp, &kio);   
               my_io_display(ksp->ks_name, ksp->ks_class, kio);   
            }   
          }   
          sleep(SLEEPTIME);   
      } /* while(1) */   
    
 }   
    
 void my_io_display(char *devname, char *class, kstat_io_t k)   
 {   
      printf("Name: %s Class:    
      printf("tnumber of bytes read    
      printf("tnumber of bytes written    
      printf("tnumber of read operations    
      printf("tnumber of write operations    
 }   
    
 void    
 my_named_display(char *devname, char *class, kstat_named_t *knp)   
 {   
      switch(knp->data_type) {   
      case KSTAT_DATA_CHAR:   
           printf("%.16s",knp->value.c);   
           break;   
      case KSTAT_DATA_INT32:   
           printf("%" PRId32,knp->value.i32);   
           break;   
      case KSTAT_DATA_UINT32:   
           printf("%" PRIu32,knp->value.ui32);   
           break;   
      case KSTAT_DATA_INT64:   
           printf("%" PRId64,knp->value.i64);   
           break;   
      case KSTAT_DATA_UINT64:   
           printf("%" PRIu64,knp->value.ui64);   
     }   
 } 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.