ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. 1 Âü°í ¸µÅ©2 kstat library¿¡ ´ëÇÑ ¼Ò°³
kstat library ´Â Solaris¿î¿µÃ¼Á¦¿¡¼ Ä¿³ÎÀÇ ¿©·¯°¡Áö Åë°èÁ¤º¸¿¡ Á¢±ÙÇϱâ À§ÇÑ ÇÔ¼ö¸¦ Á¦°øÇÑ´Ù. ÀÌ ÇÔ¼ö¸¦ ÀÌ¿ëÇϸé cpu, memory, ÀÔÃâ·ÂÀåÄ¡(interface, fd, hdd, scsi, nfs¿Í °°Àº ³×Æ®¿öÅ© ÆÄÀϽýºÅÛ)¿¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸µéÀ» ¾òÀ» ¼ö ÀÖ´Ù.
Linux¿î¿µÃ¼Á¦ÀÇ /procÆÄÀϽýºÅÛÀ» ÅëÇØ¼ ¾òÀ» ¼ö ÀÖ´Â ½Ã½ºÅÛÁ¤º¸µéÀ» kstat ¶óÀ̺귯¸®¸¦ ÅëÇØ¼ ¾òÀ» ¼ö ÀÖ´Ù°í º¸¸é µÈ´Ù. 3 kstat¸¦ ÅëÇÑ Ä¿³Î Á¤º¸ ¼öÁý3.1 kstat ¸í·ÉÀ» ÅëÇÑ ÀÚ¿ø È®ÀÎ
Solaris´Â ½Ã½ºÅÛÁ¤º¸¸¦ ¸ð´ÏÅ͸µÇϱâ À§ÇÑ ½Ã½ºÅÛ °ü¸®ÀÚ¸¦ À§ÇÑ kstat¶ó´Â ½Ã½ºÅÛ ¸í·ÉÀ» Á¦°øÇÑ´Ù.
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
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
......
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) °³¹ßÀڵ鿡°Ô ´ÙÀ½°ú °°Àº »çÇ×À» Á¦°øÇÑ´Ù.
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¸¦ »ðÀÔÇÒ °ÍÀÌ´Ù. 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ºñÆ® ³ª³ë¼¼ÄÁµå °ªÀ» °®´Â´Ù.
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 vmemks_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_IOks_data_size ´Â data sectionÀÇ total size¸¦ ³ªÅ¸³»¸ç byte ´ÜÀ§ÀÌ´Ù. 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¿¡¼ ¼³¸íÇØ ³õ¾Ò´Ù.
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_TIMERdata sectionÀÇ Àüü »çÀÌÁî´Â ks_data_size Çʵ忡¼ ¾Ë ¼ö ÀÖÀ¸¸ç byte ´ÜÀ§ÀÌ´Ù. 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Àº ÀÓÀÇÀÇ name = value Åë°è(statistics) ¸®½ºÆ®¸¦ ÀúÀåÇϰí ÀÖ´Ù. Example 5´Â named kstatÀ» ´ã±â À§ÇØ »ç¿ëµÇ´Â ±¸Á¶Ã¼¸¦ º¸¿©ÁØ´Ù. 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¸¦ Ãâ·ÂÇÒ ¶§ »ó±âÇØ¾ß ÇϹǷΠÀÌ »ç½ÇÀº Áß¿äÇÏ´Ù. ÀÌ 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
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;
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ÀÌ ¾Æ´Ï¶ó¸é) 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¸¦ °¡Áø´Ù.
kstat namespace´Â kstat ±¸Á¶Ã¼¿¡¼ 3°³ÀÇ field·Î Á¤ÀǵȴÙ. ks_module ks_instance ks_nameÀÌ ¼¼ fieldÀÇ Á¶ÇÕÀº À¯ÀϼºÀ» º¸Àå¹Þ´Â´Ù.
ù ¹øÂ° interfaceÀÇ network Åë°è¿¡ ´ëÇÑ kstat data´Â ks_module == "hme", ks_instance == 0, ks_name == "hme0"¿¡¼ ãÀ» ¼ö ÀÖ´Ù. interrupt Åë°è´Â ks_module == "hme", ks_instance == 0, ks_name == "hmec0" ¿¡ ÀÇÇØ ½Äº°µÇ´Â 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À» °Ë»ö ÇÑ´Ù. ÀÌ 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¸¦ ã´Â´Ù.
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ÀÇ ¸ñÀûÀÌ´Ù.
- 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À» °Ë»çÇÒ ¼ö ÀÖ´Ù. 5.8 Putting It All Together
´ç½ÅÀÇ C ProgramÀº ´ÙÀ½À» Æ÷ÇÔÇØ¾ß¸¸ ÇÑ´Ù.
#include <kstat.h>ÇÁ·Î±×·¥ÀÌ lingkingµÉ ¶§ ÄÄÆÄÀÏ·¯ ¸í·É¶óÀÎÀº "-lkstat" ÀÎÀÚ¸¦ Æ÷ÇÔÇØ¾ß¸¸ ÇÑ´Ù. cc -o print_some_kstats -lkstat print_some_kstats.c 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À» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|