Куча JVM Coldfusion против использования ОЗУ
Мне нужна помощь в разъяснении использования памяти на сервере CentOS с Coldfusion/Apache.
У меня есть скрипт, который читает файл в память и обрабатывает его построчно, вставляет в БД и удаляет файл. Не самый лучший процесс, работающий над этим, но это придется сделать сейчас.
Когда файл читается, он загружает много памяти, он заставляет сервер использовать файл подкачки, и он действительно не отвечает - общее использование оперативной памяти в TOP составляет 3,9/3,9 ГБ, а подкачка - 1,5/1,9.
Мне пришлось его перезагрузить, общее количество используемой оперативной памяти сократилось до 2 ГБ, я запустил скрипт, и он вернулся к 3 ГБ. За последние несколько часов он медленно увеличивается до 3,3 ГБ - у меня все еще есть место, и все сайты работают быстро, но память не освобождается.
Кроме того, после перезагрузки FusionReactor показывает мой Max и Allocated Heap как 3,93 ГБ, и используется в диапазоне от 0,3 ГБ до 1 ГБ - что не соответствует тому, что говорит TOP, то есть CF9 на 58% от 3,9, что составляет около 2,25 ГБ.
Сценарий импортирует данные в одночасье, поэтому я предполагаю, что когда он запустится позже, он попадет в раздел подкачки и замедлит работу сайта в одночасье (низкий трафик в одночасье, но все еще нуждается в исправлении - сейчас мне придется отключить)
Итак, 2 вещи, которые я не понимаю:
- почему ОЗУ не сбрасывается с 3 -> 2, когда файл прочитан, а сценарий завершен (отсутствует
fileClose
- слишком много ХФУ?) - почему моя куча памяти, используемой FusionReactor, показывает максимум 1 ГБ, когда TOP показывает 58% из 3,9 ГБ (2,25 ГБ) для CF9
ОБНОВЛЕНИЕ - jvm.config, меньше большинства его комментариев
# 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
1 ответ
Ваши настройки кучи настраивают 4 гигабайта, а не 2 - это то, что вам говорит Xms4096m -Xmx4096m. Пермский размер добавляет еще 200 мег. Ваш новый размер (количество, которое молодой ген хватает за одну операцию) очень велик - обычно это число составляет от 64 до 256 м, что дает пространство для генерации, чтобы перемещаться вверх и вниз по молодой куче.
Так что тот факт, что вы видите 3.9g активным, является правильным - хотя я ожидаю увидеть что-то вроде 4.2. Тем не менее Top иногда делает нечетные вычисления с распределением JVM.
Вы правы в том, что ColdFusion/Jrun считывает файл в память (в кучу) в целом - поэтому ваша куча должна быть достаточно большой, чтобы вместить это. Тем не менее, даже небольшой файл, если он запускает молодое поколение, приведет к выделению полного гигабайта из-за вашего параметра newsize.
Если у вас всего 4 гигабайта на сервере, я бы предложил, чтобы вы установили newsize и maxnewsize на 256 м, а вашу кучу на 3072 м, например, Xms3072m -Xmx3072m
Эти настройки применяются к 64-битному серверу CF 9 - если вы работаете с 32-битной версией, у вас есть жесткие ограничения около 2 гигабайт для кучи из-за смежной проблемы mem, присущей всем 32-битным платформам. Удачи.