Назад | Перейти на главную страницу

Куча JVM Coldfusion против использования ОЗУ

Мне нужна помощь в разъяснении использования памяти на сервере CentOS под управлением Coldfusion / Apache.

У меня есть сценарий, который считывает файл в память и обрабатывает его построчно, вставляет в БД и удаляет файл. Не лучший процесс, над ним работать, но пока придется.

Когда файл читается, он занимает много памяти, это заставляло сервер использовать файл подкачки, и он действительно не отвечал - общее использование ОЗУ в TOP составляло 3,9 / 3,9 ГБ, а своп - 1,5 / 1,9

Мне пришлось перезагрузить его, общий объем используемой оперативной памяти упал примерно до 2 ГБ, я запустил скрипт, и он снова увеличился до 3 ГБ. Он медленно увеличивается за последние несколько часов до 3,3 ГБ - у меня все еще есть место, и все сайты работают, но память не освобождается.

Кроме того, после перезагрузки FusionReactor показывает мой максимальный размер и выделенную кучу как 3,93 ГБ и используется в диапазоне от 0,3 ГБ до 1 ГБ, что несовместимо с тем, что говорит TOP: CF9 на 58% от 3,9, что составляет около 2,25 ГБ.

Скрипт импортирует данные в одночасье, поэтому я предполагаю, что когда он запустится позже, он перетечет в своп и замедлит работу сайта в одночасье (низкий трафик в ночное время, но все еще требует исправления - мне придется отключить на данный момент)

Итак, 2 вещи, которые я не понимаю:

ОБНОВИТЬ - 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

Ваши настройки кучи настраивают 4 гига, а не 2 - это то, что вам говорят Xms4096m -Xmx4096m. Пермский размер добавляет еще 200 мегабайт. Ваш Новый размер (количество, которое молодые поколения захватывают за одну операцию) очень велик - обычно это число составляет от 64 до 256 метров, что дает поколению пространство для передвижения вверх и вниз по молодой куче.

Так что тот факт, что вы видите активность 3,9 г, является правильным - хотя я ожидал увидеть что-то вроде 4,2. Тем не менее Top иногда делает странные математические вычисления с распределениями JVM.

Вы правы, что ColdFusion / Jrun считывает файл в память (в кучу) целиком, поэтому ваша куча должна быть достаточно большой, чтобы вместить это. Тем не менее, даже небольшой файл, если он запускает молодое поколение, приведет к выделению полного гигабайта из-за вашего параметра newsize.

Если у вас всего 4 гигабайта на сервере, я предлагаю вам установить размер новостей и maxnewsize на 256 м, а для кучи - 3072 м, например, Xms3072m -Xmx3072m

Эти настройки применяются к 64-битный сервер CF 9 - если вы используете 32-битную версию, то у вас есть жесткие ограничения в размере около 2 гигабайт для кучи из-за проблемы непрерывной памяти, присущей всем 32-битным платформам. Удачи.