Mesurer les défauts de page du programme AC

Je compare quelques appels système où je lis / écris depuis / vers la mémoire. Y at-il une API définie pour mesurer les défauts de page (pages in / out) dans C ?

J’ai trouvé cette librairie libperfstat.a mais c’est pour AIX , je n’ai rien trouvé pour linux.

Edit: Je connais les commandes time & perf-stat sous linux, en explorant simplement si je peux utiliser quelque chose dans le programme C

Il existe getrusage fonction getrusage (SVr4, 4.3BSD. POSIX.1-2001; tous les champs ne sont pas définis en standard). Dans Linux, il y a plusieurs champs cassés , mais l’ man getrusage énumère plusieurs champs intéressants:

 long ru_minflt; /* page reclaims (soft page faults) */ long ru_majflt; /* page faults (hard page faults) */ long ru_inblock; /* block input operations */ long ru_oublock; /* block output operations */ 

Le rusage est également signalé dans wait4 (utilisable uniquement dans les programmes externes). Celui-ci est utilisé par le programme /usr/bin/time (il imprime le nombre de fautes de page mineures / majeures).

Si vous utilisez Linux, vous pouvez utiliser l’ perf_event_open système perf_event_open (utilisé par perf stat). Il est un peu difficile d’obtenir les bons parameters, regardez la page de manuel http://web.eece.maine.edu/~vweaver/projects/perf_events/perf_event_open.html et consultez le code ci-dessous.

Il n’y a pas de wrapper lib C, vous devez donc l’appeler comme suit:

 static long perf_event_open(struct perf_event_attr *hw_event, pid_t pid, int cpu, int group_fd, unsigned long flags) { int ret = syscall(__NR_perf_event_open, hw_event, pid, cpu, group_fd, flags); return ret; } 

puis compter les défauts de page:

  struct perf_event_attr pe_attr_page_faults; memset(&pe_attr_page_faults, 0, sizeof(pe_attr_page_faults)); pe_attr_page_faults.size = sizeof(pe_attr_page_faults); pe_attr_page_faults.type = PERF_TYPE_SOFTWARE; pe_attr_page_faults.config = PERF_COUNT_SW_PAGE_FAULTS; pe_attr_page_faults.disabled = 1; pe_attr_page_faults.exclude_kernel = 1; int page_faults_fd = perf_event_open(&pe_attr_page_faults, 0, CPU, -1, 0); if (page_faults_fd == -1) { printf("perf_event_open failed for page faults: %s\n", strerror(errno)); return -1; } // Start counting ioctl(page_faults_fd, PERF_EVENT_IOC_RESET, 0); ioctl(page_faults_fd, PERF_EVENT_IOC_ENABLE, 0); // Your code to be profiled here ..... // Stop counting and read value ioctl(page_faults_fd, PERF_EVENT_IOC_DISABLE, 0); uint64_t page_faults_count; read(page_faults_fd, &page_faults_count, sizeof(page_faults_count)); 

Ce n’est pas une API en tant que telle, mais j’ai eu beaucoup de succès en lançant mon propre fichier / proc / myPID / stat depuis mon programme C qui inclut des statistiques sur les erreurs de page pour mon processus. temps que mon programme fonctionne et les stocker comme je les aime.

Rappelez-vous que cela peut provoquer des défauts de page en soi, il y aura donc une certaine imprécision, mais vous aurez une idée générale.

Voir ici pour plus de détails sur le format du fichier: https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_MRG/1.3/html/Realtime_Reference_Guide/chap-Realtime_Reference_Guide-Memory_allocation.html