O heap da JVM do Coldfusion versus o uso da RAM

2

Preciso de ajuda para esclarecer o uso da memória em um servidor CentOS que executa Coldfusion / Apache.

Eu tenho um script que lê um arquivo na memória e o processa linha por linha, insere no banco de dados e exclui o arquivo. Não é o melhor processo, trabalhando nisso, mas terá que ser feito por enquanto.

Quando o arquivo é lido, ele ocupa um monte de memória, fazendo com que o servidor use o arquivo de troca e não responde - o uso total de RAM no TOP foi de 3.9 / 3.9 GB e o swap foi de 1.5 / 1.9

Eu tive que reiniciá-lo, o total de RAM usada caiu para cerca de 2GB, eu corri o script e ele voltou para 3GB. Ele aumentou lentamente nas últimas horas para 3,3 GB - ainda tenho espaço e os sites são responsivos, mas a memória não está sendo liberada.

Além disso, desde a reinicialização, o FusionReactor mostra meu Max and Allocated Heap como 3.93GB e Used variando de 0.3GB a 1GB - o que é inconsistente com o que TOP diz, que é CF9 em 58% de 3.9, que é de cerca de 2.25GB

O script importa os dados durante a noite, então eu acho que quando for executado mais tarde, ele vai cair na troca e atrasar o site durante a noite (baixo tráfego durante a noite, mas ainda precisa ser corrigido - eu vou ter que desativar por enquanto)

Então as duas coisas que eu não entendo:

  • por que a RAM não está caindo de 3 - > 2 quando o arquivo foi lido e o script foi concluído (faltando um fileClose - CFCs demais?)
  • por que minha pilha usada de memória do FusionReactor mostra um máximo de 1 GB, quando TOP mostra 58% de 3,9 GB (2,25 GB) para CF9

UPDATE - jvm.config, menos a maioria dos comentários

# Where to find JVM
java.home=/opt/coldfusion9/runtime/jre/

# Arguments to VM
java.args=-server  -Djava.awt.headless=true -Xms4096m -Xmx4096m 
    -Dsun.io.useCanonCaches=false -XX:ParallelGCThreads=2 -XX:PermSize=64m 
    -XX:+UseConcMarkSweepGC -XX:NewSize=1024m -XX:MaxNewSize=1024m -XX:SurvivorRatio=4
    -XX:+UseParNewGC -XX:MaxPermSize=192m -Dcoldfusion.rootDir={application.home}/../ 
    -Dcoldfusion.libPath={application.home}/../lib -Dcoldfusion.classPath=
    {application.home}/../lib/updates,{application.home}/../lib,
    {application.home}/../gateway/lib/,{application.home}/../wwwroot/WEB-INF/flex/jars,
    {application.home}/../wwwroot/WEB-INF/cfform/jars -
    javaagent:/opt/fusionreactor/instance/coldfusion.CF9Standalone.cc02/                 
    fusionreactor.jar=name=coldfusion.CF9Standalone.cc02,address=8088

# commas will be converted to platform specific separator and the result will be passed
# as -Djava.ext.dirs= to the VM
java.ext.dirs={jre.home}/lib/ext

# where to find shared libraries
java.library.path={application.home}/../lib
system.path.first=false

# set the current working directory
java.user.dir={application.home}/../../lib

# JVM classpath
java.class.path={application.home}/servers/lib,{application.home}/../lib/
    macromedia_drivers.jar,        
    {application.home}/lib/cfmx_mbean.jar,{application.home}/../lib/oosdk/classes,
    {application.home}/../lib/oosdk/lib,{application.home}/lib
    
por Pete 06.01.2015 / 16:55

1 resposta

2

Suas configurações de heap configuram 4gigs não 2 - é o que o Xms4096m -Xmx4096m está lhe dizendo. O tamanho do perm adiciona mais 200 megas. Seu novo tamanho (a quantidade que o jovem gen agarra em uma única operação) é muito alto - normalmente esse número está entre 64 e 256 m - dando espaço de geração para percorrer o jovem monte.

Portanto, o fato de você ver 3.9g ativo está correto - embora eu espere ver algo como 4.2. Ainda Top às vezes faz matemática estranha com alocações de JVM.

Você está correto que o ColdFusion / Jrun leu o arquivo na memória (no heap) como um todo - assim, seu heap precisa ser grande o suficiente para acomodar isso. Ainda assim, mesmo um arquivo pequeno, se desencadear uma geração jovem, resultará em um total de gigabytes de alocação por causa de seu parâmetro newsize.

Se você tiver apenas 4 GB no servidor, minha sugestão é que você configure newsize e maxnewsize para 256m, e configure seu heap para 3072m, assim Xms3072m -Xmx3072m

Essas configurações se aplicam a um servidor CF 9 de 64 bits - se você estiver executando 32 bits, terá as limitações de cerca de 2 GB para o heap devido ao problema contíguo de mem nativo em todos os 32 bits plataformas. Boa sorte.

    
por 06.01.2015 / 17:26