Как предварительно выделить память для процесса в солярисе? - PullRequest
1 голос
/ 24 сентября 2008

Моя проблема:

У меня есть Perl-скрипт, который использует много памяти (ожидаемое поведение из-за кэширования). Но я заметил, что чем больше я кеширую, тем медленнее он работает и процесс проводит большую часть времени в режиме сна.

Я думал, что предварительное выделение памяти процессу может повысить производительность.

У кого-нибудь есть идеи?

Обновление

Я думаю, что я не очень ясно здесь. Я уточню вопрос:

Я не ищу способы предварительного размещения внутри скрипта perl. Я не думаю, что это помогло бы мне здесь. Что меня интересует, так это способ заставить ОС выделять X памяти для моего сценария perl, чтобы он не конкурировал с другими процессами, которые появятся позже.

Предположим, что мне не сходит с рук использование памяти. Хотя, я тоже изучаю способы уменьшения этого, но не ожидаю большого улучшения там. К вашему сведению, я работаю на машине солярис 10.

Ответы [ 10 ]

4 голосов
/ 27 сентября 2008

Из ваших постов и комментариев я понял следующее:

  • Ваша программа замедляется при увеличении использования памяти
  • Ваша пограмма все больше времени тратит на сон, а не на вычисления.

Скорее всего, eplanation: спящий означает ожидание, когда ресурс станет доступным. В этом случае ресурс скорее всего является памятью. Используйте команду vmstat 1 для проверки. Посмотрите на столбец sr. Если она последовательно выходит за пределы ~ 150, система отчаянно пытается освободить страницы, чтобы удовлетворить спрос. Это сопровождается высокой активностью в столбцах pi, po и fr.

Если это действительно так, ваш лучший выбор:

  • Обновление системной памяти для удовлетворения спроса
  • Сокращение использования памяти до уровня, подходящего для данной системы.

Предварительное распределение памяти не поможет. В любом случае спрос на память в какой-то момент превысит объем доступной основной памяти. Затем ядро ​​должно решить, какие страницы должны быть в памяти сейчас, а какие можно очистить и использовать повторно для более срочно необходимых страниц. Если все регулярно необходимые страницы (рабочий набор) превышают объем основной памяти, система постоянно перемещает страницы из вторичного хранилища и обратно (подкачка). Говорят, что система бьется и тратит мало времени на полезную работу. С этим ничего нельзя поделать, кроме добавления памяти или ее использования.

2 голосов
/ 26 сентября 2008

Из комментария:

Ограничения памяти не очень серьезны, но объем памяти легко увеличивается до ГБ, а когда у нас есть конкурирующие процессы для памяти, он очень медленный. Я хочу зарезервировать некоторую память из ОС, чтобы перегрузка была минимальной, даже если приходит слишком много других процессов. Джагмал

Тогда давайте возьмем другую тактику. На самом деле проблема не в вашем Perl-скрипте. Вместо этого все процессы на машине потребляют слишком много памяти, чтобы машина могла обработать ее в соответствии с настройками.

Вы можете «зарезервировать» память, но это не помешает побои. Фактически, это может усугубить проблему, поскольку ОС не будет знать, используете ли вы память или просто сохраняете ее для дальнейшего использования.

Я подозреваю, что вы страдаете трагедия общего достояния . Я прав, что многие другие пользователи находятся на рассматриваемой машине? Если это так, то это скорее социальная проблема, чем техническая проблема. Вам нужен кто-то (вероятно, системный администратор), чтобы вмешаться и координировать все процессы на компьютере. Они должны найти самых экстравагантных боров памяти и работать со своими программистами, чтобы снизить стоимость системных ресурсов. Кроме того, они должны организовать планирование процессов таким образом, чтобы распределение ресурсов было эффективным. Наконец, им может понадобиться больше или улучшенное оборудование для обработки ожидаемой загрузки системы.

0 голосов
/ 12 января 2009

Несмотря на то, что он не выделяется заранее, как вы просили, вы также можете посмотреть опции большого размера страницы, чтобы, когда Perl должен запросить у ОС больше памяти для вашей программы, он получает ее в большие куски.

См. Внутренние компоненты Solaris: поддержка нескольких размеров страницы для получения дополнительной информации об этих различиях и о том, как это сделать.

0 голосов
/ 01 октября 2008

Одна вещь, которую вы могли бы сделать, это использовать зоны (контейнеры) соляриса.
Вы можете поместить свой процесс в зону и выделить ему ресурсы, такие как ОЗУ и ЦП.
Вот две ссылки на некоторые учебные пособия:

  1. Контейнеры Solaris Руководство по применению
  2. Управление ресурсами зоны в ОС Solaris 10 08/07
0 голосов
/ 25 сентября 2008

Звучит так, как будто вы ищете limit или ulimit . Но я подозреваю, что это приведет к сбою скрипта, превышающего лимит, что, вероятно, не то, что вам нужно.

Лучшей идеей может быть обмен кэшированных данных между процессами. На мой взгляд, размещение данных в базе данных или в файле хорошо работает.

Мне неприятно это говорить, но если у вас серьезные ограничения памяти, Perl, вероятно, не подходит для этого приложения. Я думаю, С был бы лучшим выбором.

0 голосов
/ 25 сентября 2008

Я пока не могу найти способ сделать это.

Но я узнал, что (подробности см. , это )

Память, выделенная для лексики (т. Е. переменные my () не могут быть восстановлены или повторно использовать, даже если они выходят за рамки. Зарезервировано на случай, если переменные вернись в сферу. Выделенная память к глобальным переменным могут быть повторно использованы (в вашей программе) с помощью undef () ing и / или delete ().

Итак, я полагаю, что здесь может быть возможность проверить, могу ли я уменьшить общий объем памяти лексических переменных в данный момент времени.

0 голосов
/ 24 сентября 2008

Недавно я заново открыл замечательную статью Рэндала Шварца , которая включает в себя предварительное распределение массива. Предполагая, что это ваша проблема, вы можете протестировать предварительное распределение с помощью этого кода. Но обязательно проверьте результат.

Причина, по которой скрипт замедляется при увеличении объема кэширования, может быть thrashing . Предположительно, причина кеширования в первую очередь заключается в повышении производительности. Итак, быстрый ответ: уменьшить кеширование.

Теперь могут быть способы изменить схему кэширования, чтобы она использовала меньше основной памяти и избегала перегрузки. Например, вы можете обнаружить, что кэширование в файл или базу данных, а не в память может повысить производительность. Я обнаружил, что кэширование файловой системы и базы данных может быть более эффективным, чем кэширование приложений, и может использоваться несколькими экземплярами.

Другая идея может состоять в том, чтобы изменить ваш алгоритм, чтобы уменьшить использование памяти в других областях. Например, вместо того, чтобы вытягивать весь файл в память, программы на Perl лучше работают построчно.

Наконец, вы изучили модуль Memoize ? Возможно, это не сразу применимо, но это может быть источником идей.

0 голосов
/ 24 сентября 2008
my @array;
$#array = 1_000_000; # pre-extend array to one million elements,
                     # http://perldoc.perl.org/perldata.html#Scalar-values

my %hash;
keys(%hash) = 8192; # pre-allocate hash buckets 
                    # (same documentation section)

Не будучи знакомым с вашим кодом, я рискну высказать некоторые дикие предположения здесь [ухмыляется], что эти методы не принесут новую большую эффективность вашему сценарию, но что предварительное распределение может немного помочь.

Удачи!

- Дуглас Хантер

0 голосов
/ 24 сентября 2008

Посмотрите на http://metacpan.org/pod/Devel::Size

Вы могли бы также встроить функцию c, чтобы сделать выше.

Насколько я знаю, вы не можете выделять память непосредственно из Perl. Вы можете обойти это, написав модуль XS или используя встроенную функцию C, как я упоминал.

0 голосов
/ 24 сентября 2008

Некоторые вопросы, которые вы можете себе задать:

  • действительно ли мои структуры данных полезны для поставленной задачи?
  • действительно ли мне нужно так много кэшировать?
  • можно ли через некоторое время выбросить кэшированные данные?
...