Мне нужна помощь в разъяснении использования памяти на сервере 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 вещи, которые я не понимаю:
fileClose
- слишком много ХФУ?)ОБНОВИТЬ - 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-битным платформам. Удачи.