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

Какой объем памяти я могу заблокировать до того, как система начнет свопинг / перегрузку?

Я пытаюсь использовать Memtester в качестве стресс-теста памяти и проверки корректности Linux-систем моей организации. Memtester в основном просто берет объем памяти для тестирования в качестве аргумента, блокирует этот объем памяти, используя memlock(), а затем запускает ряд шаблонов, чтобы убедиться, что память в порядке.

Поскольку я пытаюсь проверить правильность, я хочу протестировать как можно больше памяти машины. Я пытался сделать это, передав ему MemFree из / proc / meminfo. Или, скорее, у меня есть сценарий, который порождает несколько процессов, каждый из которых запрашивает MemFree (см. Ниже), потому что ОС не позволяет одному процессу блокировать более 50% памяти.

Проблема в том, что если я блокирую более ~ 90% памяти, мой компьютер зависает, предположительно из-за сбоя. Примерно через 30 минут я, наконец, снова могу им пользоваться.

Есть ли способ, программно или иным образом, узнать, сколько памяти я могу заблокировать, прежде чем она начнет заменяться?

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


часть скрипта, запускающего процессы memtester

    while [ $MEMAVAILABLE -ge 0 ] 
    do
        ./memtester $MEMAVAILABLE'K' &
        sleep 10 #wait for previous process to lock its memory
        MEMFREE=`cat /proc/meminfo | grep "MemFree" | sed 's/MemFree:\(\s\)*\(.*\) kB/\2/g'`
        MEMAVAILABLE=$(($MEMFREE-($MEMTOTAL*5/100)))
    done
    wait

.

Ваш сценарий, вероятно, выделяет слишком много из-за состояния гонки. В statement1 и statement2 оператор2 может выполняться раньше, и цикл будет продолжен. И так далее.

Вы не можете выделить больше памяти? Думаю, я бы попробовал поиграть с ulimit.

Теперь к главному - сколько мем. Linux не работает по DOS-подобной модели в отношении «свободной» памяти. Метрику MemFree действительно следует называть MemFreeImmediatelyAvailable. Вы можете выделить гораздо больше, и ничего не произойдет, кроме, возможно, небольшой страницы. Но если вы используете память, это не означает, что MemFree уменьшится - ядро ​​преобразует Inact_clean в MemFree, как только сможет, чтобы поддерживать определенный минимальный размер MemFree (еще одна причина, по которой ваш скрипт будет использовать слишком много). Основным примером категории Inact_clean обычно является кеш чтения для файловой системы - ядро ​​может немедленно "отбросить" его, поскольку программе требуется больше памяти. Я не говорю, что можно спокойно съесть все из этого, но большую часть, да, вы можете.

  • Активная: память, которая использовалась совсем недавно и обычно не восстанавливается без крайней необходимости.
  • Inact_dirty: Dirty означает «может потребоваться запись на диск или свопинг». Чтобы освободиться, требуется больше работы. Примерами могут быть файлы, в которые еще не производилась запись. Они не записываются в память слишком рано, чтобы снизить скорость ввода-вывода. Например, если вы пишете журналы, возможно, лучше подождать, пока у вас будет готов полный журнал, прежде чем отправлять его на диск.
  • Inact_clean: Считается, что его можно легко освободить. Ядро будет пытаться сохранить немного чистого материала, чтобы всегда было немного места для передышки.
  • Inact_target: просто метрика цели, которую ядро ​​использует для проверки наличия достаточного количества неактивных страниц. При превышении ядро ​​не сможет перемещать страницы из активных в неактивные. Страница также может стать неактивной несколькими другими способами, например если вы выполняете длительный последовательный ввод-вывод, ядро ​​предполагает, что вы не собираетесь использовать эту память, и делает ее неактивной превентивно. Таким образом, вы можете получить больше неактивных страниц, чем целевое, потому что ядро ​​помечает некоторый кеш как «с большей вероятностью никогда не будет использоваться» и позволяет обмануть его в порядке «последнего использования».

http://www.redhat.com/advice/tips/meminfo.html

Наконец, я считаю это более элегантным эквивалентом:

sed -n '/MemFree/s/.*MemFree:\s*\([0-9]*\) kB.*/\1/gp' /proc/meminfo