Esistono una classe di applicazioni in cui non si vuole loro di scambiare . Una di queste classi è un database. I database useranno la memoria come cache e buffer per le loro aree disco, e non ha assolutamente senso che questi vengano mai scambiati. La memoria particolare può contenere alcuni dati rilevanti che non sono necessari per una settimana fino al giorno in cui un cliente lo richiede.Senza il caching/swapping, il database troverebbe semplicemente il record relativo sul disco, che sarebbe abbastanza veloce; ma con lo scambio, il servizio potrebbe richiedere molto tempo per rispondere.
mysqld
include il codice per utilizzare la chiamata sistema/sistema memlock
. Su Linux, dal momento che almeno 2.6.9, questa chiamata di sistema funzionerà per processi non root che hanno la capacità CAP_IPC_LOCK
[1]. Quando si utilizza memlock()
, il processo deve comunque funzionare entro i limiti del limite LimitMEMLOCK
. [2]. Una delle (poche) cose positive su systemd
consiste nel fatto che è possibile concedere il processo mysqld
a queste funzionalità, senza richiedere un programma speciale. Se è possibile impostare i rlimits come ci si aspetterebbe con ulimit
. Ecco un file override
per mysqld
che fa i passi necessari, tra cui un paio di altri che potrebbe essere necessario per un processo come un database:
[Service]
# Prevent mysql from swapping
CapabilityBoundingSet=CAP_IPC_LOCK
# Let mysqld lock all memory to core (don't swap)
LimitMEMLOCK=-1
# do not kills this process if low on memory
OOMScoreAdjust=-900
# Use higher io scheduling
IOSchedulingClass=realtime
Type=simple
ExecStart=
ExecStart=/usr/sbin/mysqld --memlock $MYSQLD_OPTS
Nota La comunità mysql di serie attualmente fornito con Type=forking
e aggiunge --daemonize
nell'opzione per il servizio sulla linea ExecStart
. Questo è intrinsecamente meno stabile del metodo sopra.
UPDATE Non sono soddisfatto al 100% di questa soluzione. Dopo diversi giorni di runtime, ho notato che il processo aveva ancora enormi quantità di scambio! Esaminando /proc/XXXX/smaps
, prendo nota quanto segue:
- Il più grande contributore di scambio è da un segmento di stack! 437 MB e fluttuante. Ciò presenta evidenti problemi di prestazioni. Indica anche perdita di memoria basata sullo stack.
- Ci sono zero Pagine bloccate. Ciò indica che l'opzione
memlock
in MySQL (o Linux) è danneggiata. In questo caso, non importa molto perché MySQL non può memlock stack.
Unix era solito onorare il "sticky bit" se si eseguiva un "chmod + S" su un'app, ma non credo che funzioni di più. –
Mi spiace, voglio dire "chmod + t", ma ho solo guardato e Linux ignora il bit appiccicoso. –
http://blogs.msdn.com/b/oldnewthing/archive/2005/06/07/426294.aspx – Hello71