Na verdade o título deveria ser “Como fazer o Java usar HugePages“.
Primeiro quero esclarecer que eu já estou contando que você saiba o que é HugePages, o intuito aqui é mostrar só como fazer com o que o Java, mais especificamente utilizando o JBoss, utilize este recurso.
Primeiro você precisa configurar os usuários e grupo que vão poder utilizar o recurso, para isso existe um helper que vai te ajudar fazer isso, provavelmente só em RHEL5 e RHEL6 e derivados, nas outras distriuições você vai ter que fazer na mão.
O helper é o huge_page_setup_helper.py provido pelo pacote libhugetlbfs-utils, também em RHEL5 e 6 e derivados.
Executadndo o helper para alocar 4GB de memória para seja utilizado HugePages.
[root@hostjboss ~]# huge_page_setup_helper.py
Current configuration:
* Total System Memory……: 7872 MB
* Shared Mem Max Mapping…: 0 MB
* System Huge Page Size….: 2 MB
* Number of Huge Pages…..: 2048
* Total size of Huge Pages.: 4096 MB
* Remaining System Memory..: 3776 MB
* Huge Page User Group…..: jboss (497)How much memory would you like to allocate for huge pages? (input in MB, unless postfixed with GB): 4096 <- Inserir a quantidade de memória em MB que você quer alocar
Okay, we’ll try to allocate 4096 MB for huge pages…What group should have access to the huge pages?(The group will be created, if need be) [hugepages]: jboss <- Insira o grupo que deverá poderá usar as HugePages, se não existir um grupo “hugepages” é sugerido, e se você não informar nenhum este grupo será utilizado.
Okay, we’ll give group jboss access to the huge pages
Group jboss (gid 497) already exists, we’ll use itWhat user(s) should have access to the huge pages (space-delimited list, users created as needed)? jboss <- insira os usuários separados por virgula que poderão utilizar o recurso.
Adding user jboss to huge page groupSaved original /etc/sysctl.conf as /etc/sysctl.conf.backup
Saved original /etc/security/limits.d/hugepages.conf as /etc/security/limits.d/hugepages.conf.backupFinal configuration:
* Total System Memory……: 7872 MB
* Shared Mem Max Mapping…: 4096 MB
* System Huge Page Size….: 2 MB
* Available Huge Pages…..: 2048
* Total size of Huge Pages.: 4096 MB
* Remaining System Memory..: 3776 MB
* Huge Page User Group…..: jboss (497)
Feito isso um arquivo “/etc/security/limits.d/hugepages.conf” será criado para que o usuário jboss possa usar o recurso de lock de endereçamento de memória.
O conteúdo do arquivo depois de executado o helper:
[root@hostjboss ~]# cat /etc/security/limits.d/hugepages.conf
# Huge page access configuration
jboss soft memlock 4194304
jboss hard memlock 4194304
Só por curiosidade, este valor é 4GB em KB (Kilobytes).
A outra parte da configuração diz respeito a shared memory (SHM), que é feito no /etc/sysctl.conf, como é mostrado a seguir:
# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
kernel.shmmax = 4294967296
vm.nr_hugepages = 2048
vm.hugetlb_shm_group = 497
Rapidamente, os valores de shmall e shmmax são expressos em Bytes, e equivalem aos 4GB especificados no helper, o vm.nr_hugepages é a quantidade de páginas de memórias que serão alocadas para configura o recurso de HugePages, o tamanho da página de memória no RHEL6 é de 2048KB (2MB) que multipolicado por 2048 vai dar os 4GB especifidados, e por último o hugetlb_shm_group que é o grupo especificado para utilizar o recurso de HugePages.
Feito esta configuração os usuários do grupo jboss estarão aptos a utlizar as HugePages, entretanto é preciso que o software que você utilize saiba utilizar este recurso. o Java sabe!
E para fazer o Java utilizar este recurso, especificamente utilzando Jboss, dentro do arquivo run.conf adicione a seguinte opção no JAVA_OPTS:
-XX:+UseLargePages
Exemplo:
JAVA_OPTS=”-Xms1024m -Xmx1024m -XX:MaxPermSize=256m -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dsun.lang.ClassLoader.allowArraySyntax=true -XX:+UseLargePages“
Pronto, agora é iniciar o Jboss.
E como eu sei que o recurso está sento utilizado? Simples, execute o seguinte comando:
cat /proc/meminfo | grep Huge
HugePages_Total: 2048
HugePages_Free: 901
HugePages_Rsvd: 776
HugePages_Surp: 0
Hugepagesize: 2048 kB
Perceba esta informação:
HugePages_Free: 901
Isto quer dizer que das 2048 páginas que você alocou, ainda restam 901.
Done.