Temat: redhat / oracle / hugepages
Po dodatkowym zbadaniu sprawy, wygląda, że są to anonimowe inody i stąd brak wpisów na tych specjalnych file systemach :)
Per proces można sprawdzić czy segment SHM jest zamapowany do przestrzeni adresowej (za pomocą wspomnianego lsof bądź /proc/<pid>/maps, dla segmentów pamięci współdzielonej semid=inode).
Skoro inode jest podany dla segmentu, to kwestia w którym filesystemie (SHM/HUGETTLB) został utworzony. Wygląda, że tu może być pomocne pole DEVICE: major,minor
Podejrzewam, że dla tych filesystemów
MAJOR = 0
MINOR = wewnętrzny identyfikator kernela, pozwalający odróżnić fizyczne byty
Ale który MINOR odpowiada któremu fs, można by określić eksperymentalnie, np. przez proste utworzenie segmentu korzystającego z HUGETLB + segmentu nie korzystającego z huge TLB + podłączenie zamapowanie tychże segmentów na przestrzeń adresową proces + losf PID :)
Jak znajdę czas na zbudowanie kernela ze wsparciem dla Huge Pages, to potestuję dalej, ale póki co szkic poniżej.
MINOR pewnie będzie się różnić per maszyna / restart maszyny (kolejność tworzenia struktur kernelowych).
#include <stdio.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
int main() {
key_t key = 0x666777;
int shmid = -1, shmid2 = -1, rc = -1;
void *shm_addr = NULL, *shm_addr2 = NULL;
struct shmid_ds buf, buf2;
char *c;
shmid = shmget ( key, 8192*32,IPC_CREAT|IPC_EXCL|S_IRWXU|S_IRGRP);
if (shmid == -1 ) {
printf("Blad przy tworzeniu segmentu. Errno=%d\n",errno);
} else {
printf("SHMID =%d\n",shmid);
shm_addr = shmat(shmid, NULL, SHM_RDONLY );
if (shm_addr == (void *) -1 ) { printf("Blad dolaczania segmentu do przestrzeni adresowej procesu. Errno=%d\n",errno); } else { printf("SHMID %d attached at %X\n",shmid,shm_addr); }
}
shmid2 = shmget ( key+1, 8192*32,SHM_HUGETLB|IPC_CREAT|IPC_EXCL|S_IRWXU|S_IRGRP);
if (shmid2 == -1 ) {
printf("Blad przy tworzeniu segmentu HTLB. Errno=%d\n",errno);
} else {
printf("SHMID HTLB =%d\n",shmid2);
shm_addr2 = shmat(shmid2, NULL, SHM_RDONLY );
if (shm_addr2 == (void *) -1 ) { printf("Blad dolaczania segmentu do przestrzeni adresowej procesu. Errno=%d\n",errno); } else { printf("SHMID %d attached at %X\n",shmid2,shm_addr2); }
}
printf("Press ENTER to continue...\n");
scanf("%c",&c);
if (shm_addr != NULL ) {
if ( shmdt(shm_addr) == -1 )
{
printf("Error detaching shm segment. Errno=%d\n",errno);
}
else
{
printf("SHM segment detached.\n");
}
}
if (shm_addr2 != NULL ) {
if ( shmdt(shm_addr2) == -1 )
{
printf("Error detaching shm HTLB segment. Errno=%d\n",errno);
}
else
{
printf("SHM HTLB segment detached.\n");
}
}
printf("Usuwanie segmentow SHM\n");
shmctl(shmid2,IPC_RMID,&buf2);
shmctl(shmid,IPC_RMID,&buf);
return 0;
}
-- edit
Przy shmid2 wkradł sie brak flagi SHM_HUGETLB.
Paweł Grzegorz Kwiatkowski edytował(a) ten post dnia 22.02.12 o godzinie 13:18