====== GPFS ======
===== Documentación (GPFS v5.18) =====
{{ :wiki:scale_adm.pdf |}}
{{ :wiki:scale_ins.pdf |}}
{{ :wiki:scale_pdg.pdf |}}
===== Estructura del cluster GPFS =====
Un cluster GPFS consiste en varios elementos:
* Cluster manager: 172.27.253.31 (sdmgt01-ib0). Realiza el monitoreo de los disk leases, detecta fallas, elige el nodo de file system manager, determina la continuidad del servicio, maneja los UIDs, etc.
* Quorum nodes: sdmgt01-ib0 y sdmgt02-ib0. Nodos seleccionables para Cluster Manager.
* File system manager. Hace las reparaciones, agregado de discos, redimensionamiento de espacio, maneja las quotas (reserva bloques en el fs para quienes están escribiendo, etc.). Hay un quota manager para administrar esto.
* Metanode: uno por archivo/directorio abierto, mantiene la integridad de la metadata. La metadata se almacena en el inodo correspondiente.
* AFM gateway node: Cada "cache fileset" se vale de un servidor que se designa como gateway. Cada nodoe en el cache cluster puede funcionar como gateway.
La info del cluster manager se obtiene de correr:
$ mmlsmgr
file system manager node
---------------- ------------------
data_fs 172.27.253.32 (sdmgt02-ib0)
home_fs 172.27.253.32 (sdmgt02-ib0)
Cluster manager node: 172.27.253.31 (sdmgt01-ib0)
La data se almacena directamente en el inodo si no hay niveles de indirección, y se almacena en bloques indirectos como en UNIX en el caso contrario. El primer inodo contiene la //inode file// (lista de todos los registros de tamaño fijo representando los archivos y directorios), y hay otro pequeño grupo de inodos que contienen el resto de la información del file system. Esos inodos son el directorio root del fs, el //block allocation map// (representa la disponibilidad de bloques de espacio en disco; el tamaño de bloque, subbloque y subbloques/bloque se configuran en la creación del fs y no se pueden cambiar) y el //inode allocation map// (que mapea la disponibilidad de inodos). La información de las quotas se almacena en //quota files//, y se backupea con mmbackupconfig y mmrestoreconfig. Contiene los block limits, file limits, uso actual y período de gracia para users, grupos y filesets.
===== Directorios compartidos =====
Los discos de GPFS son /home y /data:
/home: ~46TB de scratch, almacenamiento rápido
/data: ~1PB de almacenamiento frío
Las quotas son
mmlsquota
Block Limits | File Limits
Filesystem type KB quota limit in_doubt grace | files quota limit in_doubt grace Remarks
data_fs USR 3663216 0 0 0 none | 36899 0 0 0 none
home_fs USR 20519320 0 0 0 none | 151819 0 0 0 none
mmlsfs all -Q
File system attributes for /dev/data_fs:
========================================
flag value description
------------------- ------------------------ -----------------------------------
-Q user;group;fileset Quotas accounting enabled
user;group;fileset Quotas enforced
none Default quotas enabled
File system attributes for /dev/home_fs:
========================================
flag value description
------------------- ------------------------ -----------------------------------
-Q user;group;fileset Quotas accounting enabled
user;group;fileset Quotas enforced
none Default quotas enabled
Asumiendo que la integración con df es correcta, la cantidad de inodos para /data son 128 millones y para /home 47 millones:
data_fs 128M 89K 128M 1% /data
home_fs 47M 1.7M 45M 4% /home
/data/admin: directorio restringido a users en el grupo qadmin
/data/shared: directorio abierto a todos, pero solo escritura por el grupo qadmin
/data/contrib: directorio abierto a todos, de escritura por todos pero permisos de borrado solo para el owner/sudo (sticky bit, chmod 1777)
===== Monitoreo de salud =====
Se puede ver un snapshot de la salud del cluster GPFS con
$ sudo /usr/lpp/mmfs/bin/mmhealth cluster show
Component Total Failed Degraded Healthy Other
--------------------------------------------------------------------------------------
NODE 87 1 1 82 3
GPFS 87 0 1 83 3
NETWORK 87 0 0 87 0
FILESYSTEM 2 0 0 2 0
DISK 4 0 0 4 0
FILESYSMGR 1 0 0 1 0
NATIVE_RAID 2 0 2 0 0
En cada nodo se puede correr un comando más específico:
# /usr/lpp/mmfs/bin/mmhealth node show -N cn013-ib0
Node name: cn013-ib0
Node status: HEALTHY
Status Change: 114 days ago
Component Status Status Change Reasons & Notices
-------------------------------------------------------------------------------
GPFS HEALTHY 114 days ago -
NETWORK HEALTHY 114 days ago -
FILESYSTEM HEALTHY 114 days ago -
Para todos los nodos sería mmhealth node show -N all
Y se puede obtener un histórico con
# /usr/lpp/mmfs/bin/mmhealth node eventlog
Node name: mmgt01-ib0
Timestamp Event Name Severity Details
2024-10-21 14:13:14.706824 -03 cluster_connections_bad WARNING Connection to cluster node 172.27.0.7 has 1 bad connection(s). (Maximum 2).
2024-10-21 14:13:21.499309 -03 cluster_connections_ok INFO All connections are good for target ip 172.27.0.7.
2024-10-21 14:13:21.509307 -03 local_fs_normal INFO The local file system with the mount point / used for /tmp/mmfs reached a normal level with more than 1000 MB free space.
Los eventos que aparecen **pueden hacer de trigger para algún script en caso de falla**. Eso estaría bueno implementarlo.
==== Logs ====
Los logs se encuentran disponibles en los nodos, en /var/adm/ras/mmfs.log.latest, /var/adm/ras/mmfs.log. y /var/adm/ras/mmsysmonitor..log-.gz (legible con less).
===== Rebuild de los módulos del kernel =====
Cada vez que se instala un kernel nuevo, hace falta correr mmbuildgpl:
[root@mmgt02 ~]# mmbuildgpl
--------------------------------------------------------
mmbuildgpl: Building GPL (5.1.8.2) module begins at Thu Jun 26 15:17:13 -03 2025.
--------------------------------------------------------
Verifying Kernel Header...
kernel version = 41800477 (418000477075001, 4.18.0-477.75.1.el8_8.x86_64, 4.18.0-477.75.1)
module include dir = /lib/modules/4.18.0-477.75.1.el8_8.x86_64/build/include
module build dir = /lib/modules/4.18.0-477.75.1.el8_8.x86_64/build
kernel source dir = /usr/src/linux-4.18.0-477.75.1.el8_8.x86_64/include
Found valid kernel header file under /usr/src/kernels/4.18.0-477.75.1.el8_8.x86_64/include
Getting Kernel Cipher mode...
Will use skcipher routines
Verifying Compiler...
make is present at /bin/make
cpp is present at /bin/cpp
gcc is present at /bin/gcc
g++ is present at /bin/g++
ld is present at /bin/ld
Verifying libelf devel package...
Verifying elfutils-libelf-devel is installed ...
Command: /bin/rpm -q elfutils-libelf-devel
The required package elfutils-libelf-devel is installed
Verifying Additional System Headers...
Verifying kernel-headers is installed ...
Command: /bin/rpm -q kernel-headers
The required package kernel-headers is installed
make World ...
make InstallImages ...
--------------------------------------------------------
mmbuildgpl: Building GPL module completed successfully at Thu Jun 26 15:17:56 -03 2025.
--------------------------------------------------------
===== Binarios =====
Los binarios de GPFS se encuentran en /usr/lpp/mmfs/bin/, con los siguientes comandos:
auditConsumerManager mmcesmmcchexport mmchqos mmimgrestore mmremotefs tsadddisk tskmipkm
audit_watch.snap.py mmcesmmccrexport mmclidecode mmimportfs mmrepquota tsaddpdisk tslinkfileset
auth.snap.py mmcesmmcdelexport mmclone mmimportnvmeof mmrestoreconfig tsaddrmap tslsattr
basicsnap.py mmcesmonitor mmcloudfuncs mmjob mmrestorefs tsapolicy tslsdisk
bscpwrap mmcesmonitord mmcloudgateway mmksh mmrestrictedctl tsauth tslsfileset
bsshscpwrap mmcesnetaddaddress mmcmi mmktupgrade mmrestripefile tsbackup tslsfs
bsshwrap mmcesnetchaddress mmcollectdebugdata mmlinkfileset mmrestripefs tsbackup33 tslsfsckx
callhome.snap.py mmcesnetdeladdress mmcommon mmlockf mmrpldisk tsbuhelper tslsmgr
ccrrestore mmcesnetdown mmcrcluster mmlogmsg mmrsh tscachectl tslspdisk
ces.snap.py mmcesnetlsaddress mmcrfileset mmlogsort mmsdrcli tschattr tslspolicy
cleanupkeystonedb mmcesnetmvaddress mmcrfs mmlsattr mmsdrfsdef tschcarrier tslspool
clstrwatchcallbacks mmcesnetup mmcrfsc mmlscallback mmsdrfsdef.Linux tschdisk tslspool34
clstrwatchconsumermanager mmcesnetworkmonitor mmcrnodeclass mmlscluster mmsdrquery tscheckquota tslsqos
cnss.snap.py mmcesnfschcfg mmcrnsd mmlsconfig mmsdrquerydef tschfileset tslsquota
commonsnap.py mmcesnfschexport mmcrsnapshot mmlsdisk mmsdrrestore tschfs tslsrecgroup
copyutil mmcesnfscrexport mmdefedquota mmlsfileset mmsdrserv tschmgr tslsrecoverygroupevents
core.snap.py mmcesnfsdelexport mmdefquotaoff mmlsfs mmsetquota tschpdisk tslssnapshot
daemonize mmcesnfsfuncs mmdefquotaon mmlsfsckx mmsetrcmd tschpolicy tslsvdisk
ece.callhome.py mmcesnfsloadexport mmdefragfs mmlslicense mmshutdown tschpool tsmergeshadow
ess_hal.snap.py mmcesnfslscfg mmdelacl mmlsmgr mmsmb tschqos tsnetverify
fab3.snap.py mmcesnfslsexport mmdelcallback mmlsmount mmsmbfuncs tschrecgroup tsnsdaccess
fcm.snap.py mmcesnfsmonitor mmdeldisk mmlsnode mmsmbman tschstoragepool tsnsddiscover
gds.snap.py mmcesnode mmdelfileset mmlsnodeclass mmsmbsupportedoptions tsclone tsnsdrediscover
gpfsrunlevel mmcesobjaccess mmdelfs mmlsnsd mmsmbvalidoptions tsclwatchrules tspcache
gpfs.snap mmcesobjaccesslinkfset mmdelnode mmlsperfdata mmsnapdir tscmd tspcacheevict
gui.callhome.py mmcesobjcfgman mmdelnodeclass mmlspolicy mmsnmpagentd tscp tspcachescan
gui.snap.py mmcesobjchcfg mmdelnsd mmlspool mmsnmpagentd10 tscreatedir tspcachesnapdiff
hadoop.snap.py mmcesobjchstoragepolicy mmdelsnapshot mmlsqos mmsnmpagentd30 tscrfileset tspcacheu
lxtrace mmcesobjcrbase mmdevdiscover mmlsquota mmstartpolicy tscrfs tspcacheutil
lxtrace-4.18.0-372.32.1.el8_6.x86_64 mmcesobjcrring mmdf mmlssnapshot mmstartup tscrrecgroup tspmon
lxtrace-4.18.0-477.75.1.el8_8.x86_64 mmcesobjcrstoragepolicy mmdiag mmmigratefs mmstatdcallout tscrsnapshot tsprclear
mmaddcallback mmcesobjdepstoragepolicy mmdsh mmmount mmsync tscrvdisk tspreparedisk
mmadddisk mmcesobjfuncs mmdsm mmmsgqueue mmsysmonc tsctl tsprinquiry
mmaddnode mmcesobjlscfg mmdspmsg mmnetverify mmsysmoncontrol tsdbfs tsprpreemptabort
mmadquery mmcesobjlsstoragepolicy mmdump mmnfs mmsysmon.py tsdbmemleak tsprquery
mmadquery_py2 mmcesobjmr mmdumpfilocks mmnfscleanup mmtrace tsdbmemleakparse tsprreadkeys
mmafmcmd mmcesobjpolicyfuncs mmdumpkthreads mmnfsdown mmtracectl tsdbvdisk tsprreadres
mmafmconfig mmcesobjs3 mmdumpperfdata mmnfsfuncs mmumount tsdefedquota tsprregister
mmafmcosaccess mmcesop mmdynamicmap mmnfsgrace mmunlinkfileset tsdefquotaoff tsprreserve
mmafmcosconfig mmcespnfsip mmeditacl mmnfsinit mmunmount tsdefquotaon tsprshowfence
mmafmcosctl mmcesrecovernode mmedquota mmnfsinstall mmuserauth tsdefragfs tsputacl
mmafmcoskeys mmcesservice mmexectsmcmd mmnfsmonitor mmvaryonvg tsdelacl tsqosnice
mmafmctl mmcessmbchconfig mmexecvfile mmnfsnodeback mmwatch tsdeldisk tsquotaoff
mmafmhomeconfig mmcessmbchexport mmexpelnode mmnfspreunmount mmxargs tsdelfileset tsquotaon
mmafmlocal mmcessmbcrexport mmexportfs mmnfsquorumloss mmxcp tsdelfs tsrecgroupserver
mmapplypolicy mmcessmbdelexport mmfileid mmnfsrecovernode mmyfields tsdelpdisk tsreclaimspace
mmaudit mmcessmbexportacl mmfixcfg mmnfstakeover msgqueueDaemonManager tsdelrecgroup tsremount
mmauditmount mmcessmbfuncs mmfs mmnfsuninstall msgqueueservicesmonitormanager tsdelsnapshot tsrepquota
mmauditpreunmount mmcessmblsconfig mmfsadm mmnfsup network.callhome.py tsdelvdisk tsressnapshot
mmauth mmcessmblsexport mmfsck mmnsddiscover network.snap.py tsdf tsrestorefileset
mmautoload mmcesuserauthckservice mmfsckx mmobj nfsdebug.snap.py tsdiag tsrestripefile
mmbackup mmcesuserauthcrservice mmfsctl mmpercentdecode nfspod.snap.py tsdsh tsrestripefs
mmbackupconfig mmcesuserauthlsservice mmfsd mmpercentencode nfs.snap.py tseditacl tsrpldisk
mmblock mmcesuserauthrmservice mmfsenv mmperfmon noobaa.snap.py tsedquota tssbrff
mmbuildgpl mmchattr mmfsfuncs mmpmon object.callhome.py tsexpelnode tssbrindex
mmcachectl mmchcluster mmfsfuncs.Linux mmprodname object.snap.py tsextattr tssetquota
mmcallhome mmchconfig mmfsmount mmprotocoltrace objmetric_count.py tsfileid tssnapdir
mmcallhremote mmchdisk mmgensymtable mmpsnap perfmon.callhome.py tsfindinode tsstarthelper
mmccr mmcheckquota mmgetacl mmputacl perfmon_helper.py tsfindname tsstatus
mmccrmonitor mmchecksubsys mmgetconfdata mmqos perfmon.snap.py tsfsck tsunlinkfileset
mmccrnv mmchfileset mmgetifconf mmqosnice perf.snap.py tsfsckx tsunmount
mmces mmchfs mmgetkafkaspecinfo mmquotaoff pymmcesnfsfuncs.py tsfsctl tsusercmd
mmcesauthfuncs mmchlicense mmgetstate mmquotaon pymmcesnfslsexport.py tsgetacl tsxattr
mmcesblockfuncs mmchmgr mmglobfuncs mmrcmd runmmfs tsgetscsiinfo tsyselect
mmcesfuncs mmchnode mmglobfuncs.Linux mmrcp scpwrap tsgnrgethospdata wftopichk
mmceshdfsfuncs mmchnodeclass mmgskkm mmreclaimspace smb.snap.py tsgnrvdiskfgscrub wftopics
mmcesloadmonitor mmchnsd mmhealth mmrefresh sshscpwrap tsgskkm xcputil.sh
mmceslog mmchpolicy mmhelp-apolicy mmremote sshwrap tsimgrestore
mmcesminfuncs mmchpool mmimgbackup mmremotecluster sysmon.snap.py tskafkaauth
===== Restart =====
Si el nodo se encuentra colgado por problema con los fs, y si estamos seguros de que está colgado por este motivo, se puede ejecutar:
mmshutdown; mmstartup
Que intenta desarmar el stack de gpfs (fs, driver, modulos) y volver a cargarlos, vuelve tambien a montar los fs, pero interrumpe todo proceso que de estos dependa.
Si se desea hacer un restart de cero de todo el cluster, se ejecuta:
mmstartup -a # levanta
mmgetstate -a #verifica
mmlsfs all #lista fs
mmlsmount all -L #verifica lo montado