Quando si parla di Software Defined Storage ci viene chiesto spesso come ottimizzare la gestione e le performance delle nostre soluzioni.
Quella che viene usata spesso in contesti di gestione di grande mole di documentazione composta da piccoli file è certamente la soluzione GlusterFS. Ed è qui che entriamo in gioco con le nostre attività di tuning.
Ecco un elenco completo delle migliori pratiche che negli anni abbiamo trovato ed usato nei documenti ufficiali di RHGS 3.4 e in vari altri documenti di interni per una rapida consultazione. Queste Best Practice vengono fornite come punto di partenza, setup iniziale. Si consiglia vivamente di eseguire test aggiuntivi con un assessment approfondito in quanto alcuni parametri di ottimizzazione sono specifici per carico di lavoro.
Disk Configuration
Hardware RAID
I livelli RAID più comunemente consigliati sono RAID 6 e RAID 10. RAID 6 offre una migliore efficienza dello spazio, buone prestazioni di lettura e buone prestazioni per scritture sequenziali su file di grandi dimensioni.
Se configurato su 12 dischi, RAID 6 può fornire circa il 40% in più di spazio di archiviazione rispetto a RAID 10, con una riduzione della capacità del 50%. Tuttavia, le prestazioni RAID 6 per le scritture di piccoli file e le scritture casuali tendono ad essere inferiori rispetto a RAID 10.
Se il carico di lavoro è costituito da file di dimensioni ridotte, RAID 10 è la configurazione ottimale.
Un parametro importante nella configurazione RAID dell’hardware è la dimensione dell’unità stripe. Con i dischi thin provisioning, la scelta della dimensione dell’unità stripe RAID è strettamente correlata alla scelta della dimensione del blocco thin provisioning.
Per RAID 10, si consiglia una dimensione dell’unità di striping di 256 KiB. Per RAID 6, è necessario scegliere la dimensione dell’unità di striping in modo tale che la dimensione di striping completa (unità di striping * numero di dischi dati) sia compresa tra 1 MiB e 2 MiB, preferibilmente in l’estremità inferiore dell’intervallo. I controller RAID hardware in genere consentono dimensioni dell’unità stripe con una potenza di 2. Per RAID 6 con 12 dischi (10 dischi dati), la dimensione dell’unità stripe consigliata è 128 KiB.
JBOD – Just a Bunch of Disks
Nella configurazione JBOD, i dischi fisici non sono aggregati in dispositivi RAID, ma sono visibili come dischi separati al sistema operativo. Ciò semplifica la configurazione del sistema non richiedendo un controller RAID hardware.
Se i dischi sul sistema sono collegati tramite un controller RAID hardware, consultare la documentazione del controller RAID su come creare una configurazione JBOD; in genere, JBOD è realizzato esponendo dischi raw
al sistema operativo usando la modalità pass-through
.
Nella configurazione JBOD, un singolo disco fisico funge da memoria per un brick Gluster Storage.
Le configurazioni JBOD supportano fino a 36 dischi per nodo, con volumi spare e replica a tre vie.
Brick and XFS Recommendations
Parameter | RAID6 (12 disks) | RAID10 (12 disks) | JBOD | |
---|---|---|---|---|
Physical Volume | Data Alignment | 1280 KiB* | 1536 KiB* | 256 KiB |
Volume Group | Physical Extents | 1280 KiB* | 1536 KiB* | N/A |
Logical Volume | Chunk Size | 1280 KiB | 256 KiB | 256 KiB |
Pool Metadata Size | 16 GiB | 16 GiB | 16 GiB | |
XFS | Stripe Unit | 128 KiB | 256 KiB | N/A |
Stripe Width | 10 | 6 | N/A | |
Inode Size | 512 | 512 | 512 |
*The data alignment and physical extends dovrebbe essere ottenuto moltiplicando la dimensione dell’unità stripe RAID per il numero di dischi dati. Se si utilizzano 12 dischi in una configurazione RAID 6, il numero di dischi dati è 10; d’altra parte, se 12 dischi sono utilizzati in una configurazione RAID 10, il numero di dischi di dati è 6.
Logical Block Size for the Directory
Il nostro file system preferito, XFS consente di selezionare una dimensione del blocco logico per la directory del file system maggiore della dimensione del blocco logico del file system. Aumentando la dimensione del blocco logico per le directory dal 4K predefinito, diminuisce l’I/O della directory, che a sua volta migliora le prestazioni delle operazioni della directory.
Allocation Strategy
inode32 and inode64 sono le due strategie di allocazione più comuni per XFS. Con la strategia di allocazione inode32, XFS inserisce tutti gli inode nel primo 1 TiB del disco. Con un disco più grande, tutti gli inode sarebbero bloccati nel primo 1 TiB. La strategia di allocazione inode32 è utilizzata per impostazione predefinita. Con l’opzione di montaggio inode64 gli inode verrebbero posizionati vicino ai dati, il che dovrebbe minimizzare le ricerche del disco.
Access Time
Sempre verde: se l’applicazione non richiede l’aggiornamento dell’access-time ai file, è necessario montare sempre il file system noatime
:
# mount -t xfs -o inode64,noatime <logical volume> <mount point>
Questa ottimizzazione migliora le prestazioni delle letture di file di piccole dimensioni evitando gli aggiornamenti agli inode XFS durante la lettura dei file.
Percentage of Space Allocation to inodes
Se il carico di lavoro è costituito da file molto piccoli (la dimensione media del file è inferiore a 10 KB), si consiglia di impostare il valore maxpct su 10, durante la formattazione del file system.
Writeback Caching, Brick Multiplexing and Port Range Configuration
Documentazione: https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.4/html/administration_guide/brick_configuration
Tuned Profile
Questi sono i profili TuneD ottimizzati per diversi workloads
Workload | Profile Name |
Large-file, sequential I/O workloads | rhgs-sequential-io |
Small-file workloads | rhgs-random-io |
Random I/O workloads | rhgs-random-io |
Virtual Memory Parameters
Network
Documentazione: https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.4/html/administration_guide/network4
Configuring Threads for Event Processing and Enabling Lookup Optimization
- Configuring Threads for Event Processing
- client.event-thread configuration which tunes client event threads accessing a volume
- server.event-thread configuration which tunes server event threads accessing a volume
- server.outstanding-rpc-limit configuration which queue the requests for brick processes
- performance.io-thread-count configuration which performs the actual IO operations
- Enabling Lookup Optimization
- cluster.lookup-optimize configuration option enables DHT lookup optimization
Documentazione: https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.4/html/administration_guide/small_file_performance_enhancements
Directory Operations
- Enabling metadata-cache group which improves performance of directory operations
- Enhancing directory listing performance by enabling prefetching directories
- performance.readdir-ahead
- performance.parallel-readdir
- Enhancing file/directory create performance by enabling negative lookup cache
- nl-cache group which enables serving file creation/renaming lookups from cache when possible
- The above group when enabled also enables cache-invalidation and increases the timeout to 10 minutes
Documentazione: https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.4/html/administration_guide/sect-directory_operations
Enable io-cache
- Enables and sets the file size cached by the io-cache translator
- performance.io-cache
- performance.cache-size
Small File Performance Enhancements
I seguenti parametri possono essere utilizzati per l’ottimizzazione delle prestazioni per l’accesso a file di piccole dimensioni. Questi valori sono stati testati per prestazioni di file di piccole dimensioni, tuttavia potrebbe essere necessario fare uno sforzo per testare i valori per le migliori prestazioni.
$ gluster volume set <volname> client.event-threads 4 $ gluster volume set <volname> server.event-threads 4 $ gluster volume set <volname> performance.io-thread-count 64 $ gluster volume set <volname> server.outstanding-rpc-limit: 128 $ gluster volume set <volname> cluster.lookup-optimize ontuned-adm profile rhgs-random-io |
LVM Cache
Documentazione: https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.4/html/administration_guide/sect-lvm_cache
RHGS Web Administration
Red Hat Gluster Storage Web Administration fornisce un ottimo monitoraggio visivo su infrastruttura e metriche per Red Hat Gluster Storage 3.4 ed è il metodo principale per monitorare l’ambiente il nostro Gluster Storage.
La Red Hat Gluster Storage Web Administration si basa sul progetto upstream Tendrl e utilizza Ansible automation per l’installazione. L’obiettivo principale di Red Hat Gluster Storage Web Administration è fornire metriche e visualizzazioni approfondite dei cluster Red Hat Storage Gluster e dei relativi elementi di archiviazione fisica come nodi, volumi e bricks di archiviazione.
Key features
- Monitoring dashboards for Clusters, Hosts, Volumes, and Bricks
- Top-level list views of Clusters, Hosts, and Volumes
- SNMPv3 Configuration and alerting
- User Management
- Importing Gluster cluster
For more info: https://access.redhat.com/documentation/en-us/red_hat_gluster_storage/3.4/html/monitoring_guide/overview
Complete Tuning Parameters
I seguenti parametri possono essere utilizzati per l’ottimizzazione delle prestazioni del nostro GlusterFS. Per i parametri del kernel e della rete, è possibile impostare questi valori in /etc/sysctl.conf ed eseguiti ‘sysctl -p’come root, tranne per i jumbo frame. Per i parametri Gluster, è necessario utilizzare il comando gluster su un nodo nel pool di archiviazione attendibile. Questi valori non sono sempre adatti a tutti i carichi di lavoro e vengono forniti come riferimento e non come raccomandazione. Testare vari parametri può aiutarti a trovare i valori migliori se questi non sono adeguati.
Note: Per scoprire tutti i parametri possiamo eseguire
$ gluster volume get VOLNAME all
Category | Parameter | Default Value | Setting Value |
User Limit | soft memlock | 64 | unlimited |
User Limit | hard memlock | 64 | unlimited |
User Limit | soft nofile | 1024 | 200000 |
User Limit | hard nofile | 4096 | 200000 |
User Limit | soft nproc | 1024 | 2047 |
User Limit | hard nproc | 1024 | 16384 |
User Limit | soft nofile | 1024 | 4096 |
User Limit | hard nofile | 4096 | 65536 |
Gluster | gluster volume set VOLNAME group metadata-cache | ||
Gluster | gluster volume set VOLNAME group nl-cache | ||
Gluster | gluster volume set VOLNAME group samba (for samba-ctdb vols) | ||
Gluster | features.cache-invalidation | off | on |
Gluster | features.cache-invalidation-timeout | 60s | 600s |
Gluster | performance.stat-prefetch | on | on |
Gluster | performance.md-cache-timeout | 1s | 1s |
Gluster | performance.cache-swift-metadata | true | true |
Gluster | performance.cache-samba-metadata | false | false |
Gluster | performance.force-readdirp | true | true |
Gluster | performance.cache-invalidation | false | false |
Gluster | performance.write-behind-window-size | 1MB | 1MB |
Gluster | performance.flush-behind | on | on |
Gluster | performance.write-behind-trickling-writes | on | on |
Gluster | performance.strict-write-ordering | off | off |
Gluster | performance.strict-o-direct | off | off |
Gluster | performance.resync-failed-syncs-after-fsync | off | off |
Gluster | performance.readdir-ahead | on | on |
Gluster | performance.rda-request-size | 128KB | 128KB |
Gluster | performance.rda-cache-limit | 10MB | 10MB |
Gluster | performance.parallel-readdir | off | on |
Gluster | performance.nl-cache | off | on |
Gluster | performance.nl-cache-positive-entry | false | false |
Gluster | performance.nl-cache-limit | 10MB | 10MB |
Gluster | performance.nl-cache-timeout | 60 | 60 |
Gluster | performance.quick-read | on | on |
Gluster | performance.io-cache | on | on |
Gluster | performance.cache-size | 32MB | 1GB |
Gluster | performance.cache-priority | “” | “” |
Gluster | performance.cache-max-file-size | 0 | 0 |
Gluster | performance.cache-min-file-size | 0 | 0 |
Gluster | performance.cache-refresh-timeout | 1 | 0 |
Gluster | performance.client-io-threads | on | on, except for replicated and distributed-replicated volumes |
Gluster | cluster.shd-max-threads | 1 | 1 |
Gluster | disperse.shd-max-threads | 1 | 1 |
Gluster | performance.high-prio-threads | 16 | 16 |
Gluster | performance.normal-prio-threads | 16 | 16 |
Gluster | performance.low-prio-threads | 16 | 16 |
Gluster | performance.enable-least-priority | on | on |
Gluster | performance.least-prio-threads | 1 | 1 |
Gluster | performance.io-thread-count | 16 | 64 |
Gluster | performance.read-ahead-page-count | 4 | 4 |
Gluster | performance.read-ahead | on | on |
Gluster | client.event-threads | 2 | 4 |
Gluster | server.event-threads | 1 | 4 |
Gluster | cluster.lookup-optimize | on | on |
Gluster | server.outstanding-rpc-limit | 64 | 128 |
Gluster | nfs.disable | off | on |
Gluster | network.ping-timeout | 42 | 30 |
Network | jumbo frames | 1500 | 9000 |