Короче говоря, подкачка вам не поможет , наиболее эффективным решением этой проблемы является расширение памяти , если вы не изменяете системную среду.
Теперь ответьте на вопросы, которые вы только что упомянули.
1. Почему не происходит подкачка памяти несмотря на 'vm.swappiness=100'?
Во-первых, вы должны знать, как работает своп в Linux. Когда ядро считает, что памяти недостаточно, есть два способа освободить память, чтобы облегчить ситуацию.
и 'vm.swappiness' просто контролируют, насколько агрессивно ядро будет подкачивать страницы памяти (выгружать больше анонимных страниц или восстанавливать больше кэшированных страниц)
Итак, возникает еще один вопрос: как ядро определяет, какая анонимная страница должна быть заменена? Стратегия сложная, вы можете сослаться на коды здесь в соответствии с вашей версией ядра. Кратко опишите стратегию в одном предложении, замените самые неактивные страницы. Что делать, если нет неактивной страницы, которую, по мнению ядра, можно было бы подкачать?
Вот почему ваша система не выгружает столько памяти, сколько вы думали.
2. Помогает ли принудительная подкачка памяти?
Нет. И нет общепринятого способа принудительной подкачки памяти, ее берет на себя ядро.
Я считаю, что это именно та иерархия, которую вы ищете
scratch/
└── srnaik
└── MyPDB
├── 5rea
│ ├── MD
│ │ └── production_10ns.out
│ └── analysis
│ └── production_10ns.out
├── 5res
│ ├── MD
│ │ └── production_10ns.out
│ └── analysis
│ └── production_10ns.out
└── 5rez
├── MD
│ └── production_10ns.out
└── analysis
└── production_10ns.out
Если это так, этот скрипт поможет,
#!/bin/bash
cd /scratch/srnaik/MyPDB
for i in {a..z}; do
[ -d "5re${i}" ] && cp 5re${i}/MD/production_10ns.out 5re${i}/analysis/
done
В вашем коде есть две проблемы:
production_10ns.out
в качестве имени переменной в цикле for
). cp
, что вы, похоже, делаете, используя шаблон подстановки в качестве пути назначения. Вместо этого переберите все production_10ns.out
файлы и скопируйте их в новое место:
for pathname in /scratch/srnaik/MyPDB/*/MD/production_10ns.out; do
cp "$pathname" "${pathname%/*}/../analysis"
done
Здесь "$pathname"
будет абсолютным путем к файлу production_10ns.out
в каждой итерации.
Расширение ${pathname%/*}
удалит фактическое имя файла в конце имени пути, так что если $pathname
равно /scratch/srnaik/MyPDB/5rea/MD/production_10ns.out
, то ${pathname%/*}
будет заменено на /scratch/srnaik/MyPDB/5rea/MD
.
Вы также можете использовать $( dirname "$pathname" )
вместо${pathname%/*}
:
for pathname in /scratch/srnaik/MyPDB/*/MD/production_10ns.out; do
cp "$pathname" "$( dirname "$pathname" )/../analysis"
done
../analysis
в конце пути назначения находит одноуровневый каталог analysis
.
Если предположить, что этот каталог существует, команда cp
скопирует в него файл.
Чтобы убедиться, что целевой каталог существует, используйте
mypdb_dir=/scratch/srnaik/MyPDB
for pathname in "$mypdb_dir"/*/MD/production_10ns.out; do
[ ! -f "$pathname" ] && continue
targetdir=$( dirname "$pathname" )/../analysis
mkdir -p "$targetdir" || exit 1
cp "$pathname" "$targetdir"
done
Это приведет к созданию целевого каталога, если он еще не существует, или выходу из оболочки, если не удалось создать каталог.
Я также явно проверяю, действительно ли файл, который мы сейчас исследуем, существует и является ли он обычным файлом, сначала (с помощью -f
теста ). Если шаблон, который мы итерируем, не соответствует ни одному файлу, он останется нерасширенным, и тест поймает этот сценарий.
Дополнительная переменная mypdb_dir
добавлена просто для того, чтобы сделать код более аккуратным.