[ Related: 1st part @ Locality Group Observability on Solaris ]
As of this writing, Solaris has limited support for lgroup observability using programmatic interfaces. Applications can use the lgroup API to traverse the locality group hierarchy, discover the contents of each locality group and even affect thread and memory placement on desired lgroups.
The man page for liblgrp(3LIB)
lists out the currently supported public interfaces, and a brief description for most of those interfaces can be obtained by running man -k lgroup
in
a shell. In order to use this API, applications must link with locality group library, liblgrp(3LIB)
.
The following sample code demonstrates lgroup API usage by making several lgrp_*()
calls including lgrp_device_lgrps()
to find the locality groups that are closest to the specified
I/O device.
# cat -n iodevlgrp.c 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <assert.h> 4 #include <sys/lgrp_user.h> 5 #include <sys/types.h> 6 7 int main(int argc, char **argv) { 8 9 if (argc != 2) { 10 fprintf(stderr, "Usage: %s\n", argv[0]); 11 exit(1); 12 } 13 14 /* lgroup interface version check */ 15 if (lgrp_version(LGRP_VER_CURRENT) != LGRP_VER_CURRENT) { 16 fprintf(stderr, "\nBuilt with unsupported lgroup interface %d", 17 LGRP_VER_CURRENT); 18 exit(1); 19 } 20 21 lgrp_cookie_t cookie =lgrp_init(LGRP_VIEW_OS); 22 lgrp_id_t node = lgrp_root(cookie); 23 24 /* refresh the cookie if stale */ 25 if ( lgrp_cookie_stale(cookie) ) { 26 lgrp_fini(cookie); 27 cookie =lgrp_init(LGRP_VIEW_OS); 28 } 29 30 int nlgrps = lgrp_nlgrps(cookie); 31 if ( nlgrps == -1 ) { 32 perror("\n lgrp_nlgrps"); 33 lgrp_fini(cookie); 34 exit(1); 35 } 36 printf("Number of locality groups on the system: %d\n", (nlgrps-1)); 37 38 /* lgroups closest to the target device */ 39 int numlgrps = lgrp_device_lgrps(argv[1], NULL, 0); 40 if (numlgrps == -1 ){ 41 fprintf(stderr, "I/O device: %s. ", argv[1]); 42 perror("lgrp_device_lgrps"); 43 } else { 44 printf("lgroups closest to the I/O device %s: ", argv[1]); 45 lgrp_id_t *lgrpids = (lgrp_id_t *)calloc(numlgrps, sizeof(lgrp_id_t)); 46 assert(lgrpids != NULL); 47 lgrp_device_lgrps(argv[1], lgrpids, numlgrps); 48 for (int i = 0; i < numlgrps; ++i) { 49 printf(" %d ", lgrpids[i]); 50 } 51 free(lgrpids); 52 } 53 lgrp_fini(cookie); 54 printf("\n"); 55 return 0; 56 57 } % cc -o iodevlgrp -llgrp iodevlgrp.c % ./iodevlgrp /dev/ixgbe0 Number of locality groups on the system: 2 lgroups closest to the I/O device /dev/ixgbe0: 1 % lgrpinfo -d /dev/ixgbe0 lgroup ID : 1 % ./iodevlgrp /dev/ixgbe1 Number of locality groups on the system: 2 lgroups closest to the I/O device /dev/ixgbe1: 2 % lgrpinfo -d /dev/ixgbe1 lgroup ID : 2
No comments:
Post a Comment