On Mon, Jul 09, 2007 at 11:14:18PM -0700, Alexander Kolbasov wrote: > Hi Brendan, > > can I summarize your point as a proposal to extend kstat framework > instead of providing filesystem-based representation for CPU-related > information?
Yes, as a suggestion moving to a prototype. If this approach fails for some reason, then move to /CPUfs or even /kstatfs etc. I have nothing against statistic filesystems (I suggested a /connfs in my talk at CEC2006 :), so long as it can be shown that the existing infrastructure is inadequate and can't be fixed. I've spent about 15 minutes typing it what such a kstat based CPU info implementation may look like for an example system, attached below. If someone can show how this would fail for a particular CPU type, that would be good to know (and even better if they could suggest a fix :). Naturally I'm eager to see such stable information available, somehow, as I can imagine the sort of tools that this would make possible. cheers, Brendan -- Brendan [CA, USA] kstat example ------------- Our fictitious system has 2 sockets, each socket having 8 cores, each core having 4 hardware threads. The L1 cache is shared between pairs of cores, the L2 cache is shared across all cores on a single socket, and the L3 cache is shared across both sockets. CPU layout with kstat names, +-- socket0 | | | +--- core0 | | | | | +--- thread0 | | | | | +--- thread1 | | | | | +--- thread2 | | | | | +--- thread3 | | | +--- core1 | | | | | +--- thread4 | | ... | | | +--- core2 | | | | | +--- thread8 | | ... | | | +--- core3 | | | +--- thread12 | ... | +-- socket1 | | | +--- core4 | | | | | +--- thread32 | | | ... ... ... Cache layout with kstat names, +-- l1cache_0 | +-- l1cache_1 | +-- l1cache_2 | +-- l1cache_3 ... +-- l2cache_0 | +-- l2cache_1 +-- l3cache_0 kstat cpu_info module classes, Class | Name | Desc ------------+-----------+--------------------- misc | cpu_info# | virtual CPU info (sockets or cores or threads, | | depending on architecture) socket | socket# | socket info core | core# | core info (if they exist) thread | thread# | thread info (if they exist) l1cache | l1cache# | L1 cache info l2cache | l2cache# | L2 cache info l3cache | l3cache# | L3 cache info (if they exist) Identifying relationships, Relationship | How To ---------------------+------------ cores to sockets | core stats have the socket_id threads to cores | thread stats have the core_id threads to sockets | threads stats have the socket_id L1 caches to cores | core stats have l1cache_id L2 caches to cores | core stats have l2cache_id L3 caches to cores | core stats have l3cache_id who shares L1 caches | cpu_info stats with identical l1cache_ids cpus to psets | cpu_info stats have pset_id etc... Identifier tree, socket ^ ^ l1cache l2cache l3cache || | ^ ^ ^ | | | | / / | | core | / / | | ^ ^ | / / | | | | | / / | thread | | / / | ^ / | / / | | / / / / cpu_info ---------- Either socket, core or thread can also identify the caches, depending on who is the addressable unit of CPU that the system uses. Example (fictional) kstat output, interesting lines prefixed with '!', $ kstat -m cpu_info module: cpu_info instance: 0 name: cpu_info0 class: misc brand AMD Galactic(tm) Processor 2000 clock_MHz 6842 clog_id 0 ! core_id 0 cpu_type i386 crtime 62.321739839 family 15 fpu_type i387 compatible implementation x86 (AuthenticAMD ... ! l1cache_id 0 ! l2cache_id 0 ! l3cache_id 0 model 37 ! pset_id 0 snaptime 5444553.88212403 ! socket_id 0 state on-line state_begin 1178664366 stepping 1 ! type thread ! thread_id 0 vendor_id AuthenticAMD [cpu_info0 ... cpu_info63] module: cpu_info instance: 0 name: socket0 class: socket brand AMD Galactic(tm) Processor 2000 clock_MHz 6842 cpu_type i386 crtime 62.321739839 ! ncores 8 ! nthreads 32 snaptime 5441324.10476323 ! socket_id 0 state on-line state_begin 1178664366 module: cpu_info instance: 0 name: socket1 class: socket brand AMD Galactic(tm) Processor 2000 clock_MHz 6842 cpu_type i386 crtime 62.321739839 ! ncores 8 ! nthreads 32 snaptime 5441324.10476323 ! socket_id 1 state on-line state_begin 1178664366 module: cpu_info instance: 0 name: core0 class: core clock_MHz 6842 ! core_id 0 ! l1cache_id 0 ! l2cache_id 0 ! l3cache_id 0 ! nthreads 4 snaptime 11214398.1110444 state on-line ! socket_id 0 state_begin 1172889991 module: cpu_info instance: 0 name: core1 class: core clock_MHz 6842 ! core_id 1 ! l1cache_id 0 ! l2cache_id 0 ! l3cache_id 0 ! nthreads 4 snaptime 11214398.1110444 state on-line ! socket_id 0 state_begin 1172889991 module: cpu_info instance: 0 name: core2 class: core clock_MHz 6842 ! core_id 2 ! l1cache_id 1 ! l2cache_id 0 ! l3cache_id 0 ! nthreads 4 snaptime 11214398.1110444 state on-line ! socket_id 0 state_begin 1172889991 [core3 ... core7] module: cpu_info instance: 0 name: core8 class: core clock_MHz 6842 ! core_id 8 ! l1cache_id 1 ! l2cache_id 4 ! l3cache_id 0 ! nthreads 4 snaptime 11214398.1110444 state on-line ! socket_id 1 state_begin 1172889991 module: cpu_info instance: 0 name: core9 class: core clock_MHz 6842 ! core_id 9 ! l1cache_id 1 ! l2cache_id 4 ! l3cache_id 0 ! nthreads 4 snaptime 11214398.1110444 state on-line ! socket_id 1 state_begin 1172889991 [core10 ... core15] module: cpu_info instance: 0 name: thread0 class: thread clock_MHz 6842 ! core_id 0 snaptime 11214398.1110444 state on-line ! socket_id 0 state_begin 1172889991 ! thread_id 0 [thread1 ... thread63] module: cpu_info instance: 0 name: l1cache_0 class: l1cache ! l1cache_id 0 ! ncores 2 ! nthreads 8 ! size 32768 snaptime 11214398.1110444 ! socket_id 0 module: cpu_info instance: 0 name: l1cache_1 class: l1cache ! l1cache_id 1 ! ncores 2 ! nthreads 8 ! size 32768 snaptime 11214398.1110444 ! socket_id 0 [l1cache_2 .. l1cache_7] module: cpu_info instance: 0 name: l2cache_0 class: l2cache ! l2cache_id 0 ! ncores 8 ! nthreads 32 ! size 8388608 snaptime 11214398.1110444 ! socket_id 0 module: cpu_info instance: 0 name: l2cache_1 class: l2cache ! l2cache_id 1 ! ncores 8 ! nthreads 32 ! size 8388608 snaptime 11214398.1110444 ! socket_id 1 module: cpu_info instance: 0 name: l3cache_0 class: l3cache ! l3cache_id 0 ! ncores 16 ! nsockets 2 ! nthreads 64 ! size 33554432 snaptime 11214398.1110444 _______________________________________________ perf-discuss mailing list perf-discuss@opensolaris.org