Se você usar o DISM , certifique-se de ter muito espaço na sua troca.
Quando você shmat
um membro do SHM segmento com SHM_SHARE_MMU
(que não é o padrão), você obtém um segmento ISM , que é automaticamente bloqueado na memória (não paginável). O custo desse mapeamento, na memória virtual, é apenas o tamanho da região SHM alocada. (Como não pode ser paginado, não é necessário reservar swap). mlock
não tem efeito nessas páginas, elas já estão bloqueadas.
Se você anexar o segmento com SHM_PAGEABLE
ou sem atributo, você receberá um segmento DISM . Aquele é pagável. O custo inicial é o mesmo.
Mas, se você mlock
dessa memória, a zona mlock
ed será contabilizada novamente para seu uso de RAM bloqueado. Portanto, o custo da memória virtual é (whole mapping + mlocked zone)
.
É como se, com SHM_PAGEABLE
, o mapeamento fosse criado "in swap" e as zonas que você bloqueia exigem reserva adicional "in ram" (o armazenamento de apoio para essas páginas bloqueadas não é liberado ou não reservado).
Então, o que eu estava vendo é normal, como projetado.
Algumas informações sobre isso podem ser encontradas em SGA Dynamic SGA do banco de dados Oracle no Oracle Solaris com DISM (280k PDF). Trecho:
Since DISM memory is not automatically locked, swap space must be allocated for the whole segment. [...]. But it could become a problem if system administrators are unaware of the need to provide swap space for DISM.
(Eu era um desses administradores inconscientes ...)
Dica: use pmap -xa
para ver que tipo de segmento você tem.
- ISM :
Address Kbytes RSS Anon Locked Mode Mapped File
...
80000000 1048576 1048576 1048576 1048576 rwxsR [ ism shmid=0x16 ]
^ ^^^
Observe o R
nos bits de modo: nenhuma reserva para este mapeamento.
- DISM :
Address Kbytes RSS Anon Locked Mode Mapped File
...
80000000 1048576 1048576 1048576 1048576 rwxs- [ dism shmid=0xa ]
^ ^^^^