2008-09-24 3 views
1

Моя проблема:Как вы предварительно распределите память для процесса в Solaris?

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

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

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

Update:

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

Я не ищу способы предопределения внутри скрипта perl. Я не думаю, что это мне очень помогло бы. Меня интересует способ рассказать OS о распределении Х объема памяти для моего скрипта perl, чтобы он не мог конкурировать с другими процессами, пришедшими позже.

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

+0

Это сделает ваш процесс медленнее. Заставляя использовать неоптимальное использование памяти, другим процессам потребуется больше ввода-вывода, что замедляет процесс. – 2011-09-23 08:04:10

ответ

4

Что я понял из вашей публикации и комментарии это:

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

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

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

  • Upgrade для удовлетворения спроса
  • Сокращение использования памяти в наши правила уровня системы под рукой.

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

+0

Очень полезный ответ. Возможно, до сих пор. Я попробую vmstat и обновить здесь, если у меня получится трещина. Я поддерживаю его (извините, я могу возвысить только один раз) – Jagmal 2008-09-27 16:38:22

0

Некоторые вопросы, вы можете спросить себя:

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

На данный момент ответы да, да, нет. И я бросаю ненужные вещи как можно скорее. Я уточнил вопрос для ясности. – Jagmal 2008-09-24 15:19:59

0

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

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

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

0
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

Недавно я вновь открыл прекрасную Randal L. Schwartz article, который включает предварительное выделение массива. Предполагая, что это ваша проблема, вы можете проверить предварительное распределение с изменением этого кода. Но обязательно проверьте результат.

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

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

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

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

0

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

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

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

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

0

Похоже, что вы ищете предел или ulimit. Но я подозреваю, что это приведет к тому, что скрипт, который преодолеет предел, потерпит неудачу, что, вероятно, не то, что вы хотите.

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

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

+0

Ограничения памяти не очень серьезны, но объем памяти легко растет до ГБ, и когда у нас есть конкурирующие процессы для памяти, он становится очень медленным. Я хочу зарезервировать некоторую память из ОС, чтобы измельчение было минимальным, даже когда пришло слишком много других процессов. – Jagmal 2008-09-26 01:32:37

2

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

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

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

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

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

+0

Это было очень полезно. Я поддерживаю его (я бы хотел, чтобы я проголосовал не один раз). – Jagmal 2008-09-27 16:36:40

0

Единственное, что вы можете сделать, это использовать зоны солнечных батарей (контейнеры).
Вы можете поместить свой процесс в зону и выделить ресурсы, такие как RAM и CPU.
Вот две ссылки на некоторые учебники:

  1. Solaris Containers How To Guide
  2. Zone Resource Control in the Solaris 10 08/07 OS
0

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

См. Solaris Internals: Multiple Page Size Support для получения дополнительной информации о различиях, которые это делает и как это сделать.

 Смежные вопросы

  • Нет связанных вопросов^_^