Как я могу использовать пространство Swap для аварийных ситуаций?

В случае двойных кавычек оболочка заглядывает внутрь кавычек в поисках трех вещей: переменных, обозначенных символом $ , команд, которые должны быть выполнены, обозначенных обратными кавычками, и экранирования символов с помощью \ . Помимо этих трех вещей, нет никакой разницы между одинарными и двойными кавычками. Проверьте следующие команды:

$ foo=42
$ echo "$foo"
42
$ echo '$foo'
$foo
$ echo '\$foo'
\$foo
$ echo "\$foo"
$foo
42
15.02.2019, 15:04
6 ответов

Такой огромный своп в наши дни зачастую является плохой идеей. К тому времени, когда ОС подкачал всего несколько ГБ памяти, ваша система уже заползла до смерти (, как то, что вы видели)

Лучше использоватьzramс небольшим резервным разделом подкачки . Многие операционные системы, такие как ChromeOS , Android и различные дистрибутивы Linux(Lubuntu , Fedora)годами включали zram по умолчанию, особенно для систем с меньшим объемом оперативной памяти.Это гораздо быстрее , чем подкачка на жестком диске, и в этом случае отчетливо чувствуется отзывчивость системы. В меньшей степени на SSD, но согласно результатам теста здесь он по-прежнему кажется быстрее даже с алгоритмом lzo по умолчанию. Вы можете изменить на lz4 для еще большей производительности с немного меньшей степенью сжатия. Его скорость декодирования почти в 5 раз выше, чем у lzo на основе официального теста

.

На самом деле Windows 10 и macOS также используют аналогичные методы сжатия файла подкачки по умолчанию

Есть еще zswap, хотя я им никогда не пользовался. Вероятно, стоит попробовать и сравнить, какой из них лучше подходит для ваших случаев использования

После этого другим предложением является снижение приоритета этих процессов, связанных с вводом-выводом, -и, возможно, оставить терминал работающим с более высоким приоритетом, чтобы вы могли выполнять на нем команды сразу же, даже когда система при высокой нагрузке

Дополнительная литература

15
27.01.2020, 19:35

It seems that after a day of inactivity the kernel believes the entire GUI is no longer needed and wipes it from RAM (swaps it to disk).

Ядро делает The Right Thing™ , веря в это. Зачем ему хранить неиспользуемую 1 память в ОЗУ и, по сути, тратить ее впустую, вместо того, чтобы использовать ее в качестве кеша или чего-то еще?

Я не думаю, что ядро ​​Linux безвозмездно или упреждающе подкачивает страницы, так что если оно это делает, то должно сохранять что-то еще в ОЗУ, тем самым повышая производительность вашей длительной задачи, или, по крайней мере, с этой целью.

Если вы заранее знаете, когда вам потребуется повторно использовать ноутбук, вы можете использовать команду at(или crontab), чтобы запланировать очистку подкачки(swapoff -a;swapon -a).

Поскольку очистка подкачки может быть излишней и даже вызвать убийцу OOM, если по какой-то причине не все помещается в ОЗУ, вы можете просто «отменить подкачку» 2 все, что связано с запущенными приложениями, которые вы хотите удалить. возродить.

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

# gdb -p <pid>
...
generate-core-dump /dev/null
...
quit

Как вы писали, ваше продолжительное приложение не использует повторно данные, которые оно считывает после начального прохода, поэтому вы находитесь в конкретном случае, когда долгосрочное кэширование бесполезно. Тогда обход кеша с помощью прямого ввода-вывода, как предложил Уилл Кроуфорд, должен быть хорошим обходным путем.

Кроме того, вы можете просто регулярно очищать файловый кеш, выводя 1или 3в /proc/sys/vm/drop_cachesпсевдо--файл, прежде чем ОС сочтет хорошей идеей поменять местами приложения и среду с графическим интерфейсом.

См.Как очистить буферы и кеш в системе Linux?для получения подробной информации.

1Неиспользуемый в смысле :более активно не используемый в течение значительного периода времени, память по-прежнему актуальна для своих владельцев.
2Вернуть в ОЗУ страницы, хранящиеся в области подкачки.

14
27.01.2020, 19:35

Вот идея, которую я сам не пробовал (и мне жаль, что у меня сейчас нет времени поэкспериментировать с этим ).

Предположим, вы создаете небольшую виртуальную машину только с 512 МБ памяти для фонового процесса. Я не уверен, что вы хотите, чтобы она имела какой-либо своп, ваш вызов и отключала своп в вашей хост-системе.

6
27.01.2020, 19:35

Удалите подкачку или уменьшите ее примерно на 20%(может варьироваться в зависимости от системы ), так как в последнее время ОС больше не используют подкачку так же, как в последние несколько лет. Возможно, это ответит на некоторые ваши вопросы:

--> официальный сайт redhat.com

часть информации о Red Hat ниже,

In the past, some application vendors recommended swap of a size equal to the RAM, or even twice the RAM. Now let us imagine the above-mentioned system with 2GB of RAM and 2GB of swap. A database on the system was by mistake configured for a system with 5GB of RAM. Once the physical memory is used up, swap gets used. As the swap disk is much slower than RAM, the performance goes down, and thrashing occurs. At this point, even logins into the system might become impossible. As more and more memory gets written to, eventually both physical- and swap memory are completely exhausted and the OOM killer kicks in, killing one or more processes. In our case, quite a lot of swap is available, so the time of poor performance is long.

и

https://wiki.debian.org/Swap

часть ссылки Debian выше,

Information and considerations related to the amount of swap to use:

"The recommended amount of swap space has traditionally been double the amount of system memory. This has changed over time to one and half times system memory, both answers are decent baselines but are becoming less and less useful answers to the question as time passes. There are many variables about your system and intended use that will determine the available system swap you will want to have."

Вы можете попробовать:

«Лучший способ отключить подкачку в Linux»


***Личная заметка :***

Поскольку у меня 6 ГБ ОЗУ и во всех моих последних ОС Linux. Я никогда не видел никаких указаний на использование Swap. Я решил, что долженотключить егоиз-за свободного места (еще на несколько гигабайт )и потому, что иногда это замедляло работу моей системы.

3
27.01.2020, 19:35

Одно исправление состоит в том, чтобы убедиться, что контроллер контрольной группы памяти включен (Я думаю, что он включен по умолчанию даже в половине -последних ядер, в противном случае вам нужно будет добавить cgroup_enable=memoryв командную строку ядра )]. Затем вы можете запустить задачу с интенсивным вводом-выводом в контрольной группе с ограничением памяти, что также ограничивает объем кеша, который она может потреблять.

Если вы используете systemd, вы можете установить +MemoryAccounting=yesи MemoryHigh/ MemoryMaxилиMemoryLimit(в зависимости от того, используете ли вы cgroup v1 или v2 )в модуле или срезе содержащий его. Если это слайс, вы можете использовать systemd-runдля запуска программы в слайсе.

Полный пример запуска Firefox с ограничением памяти из одной из моих систем. Обратите внимание, что здесь используется cgroups v2, и он настроен как мой пользователь, а не root (. Одним из преимуществ v2 по сравнению с v1 является то, что делегирование этого не -root безопасно, поэтому systemd делает это ).

$ systemctl --user cat mozilla.slice 
# /home/anthony/.config/systemd/user/mozilla.slice
[Unit]
Description=Slice for Mozilla apps
Before=slices.target

[Slice]
MemoryAccounting=yes
MemoryHigh=5G
MemoryMax=6G

$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/firefox &
$ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/thunderbird &

Я обнаружил, что для того, чтобы заставить пользователя работать, мне пришлось использовать слайс. Первая система работает, просто поместив параметры в файл службы (или используя systemctl set-propertyв службе ).

Вот пример службы (, использующей cgroup v1 ), обратите внимание на две последние строки. Это часть экземпляра системы (pid=1 ).

[Unit]
Description=mount S3QL filesystem
Requires=network-online.target
After=network-online.target

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
User=s3ql-user
Group=s3ql-user
LimitNOFILE=20000
ExecStartPre=+/bin/sh -c 'printf "S3QL_CACHE_SIZE=%%i\n" $(stat -c "%%a*%%S*.90/1024" -f /srv/s3ql-cache/ | bc) > /run/local-s3ql-env'
ExecStartPre=/usr/bin/fsck.s3ql  --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo  --log none «REDACTED»
EnvironmentFile=-/run/local-s3ql-env
ExecStart=/usr/bin/mount.s3ql --keep-cache --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo --cachesize ${S3QL_CACHE_SIZE} --threads 4
ExecStop=/usr/bin/umount.s3ql /mnt/S3QL/
TimeoutStopSec=2m
MemoryAccounting=yes
MemoryLimit=1G

Документация находится в systemd.resource-control(5).

28
27.01.2020, 19:35

Процесс, который вы запускаете, создан вами самостоятельно?

Если это так, возможно, стоит изменить ваш код, чтобы открывать файлы с помощью флага O_DIRECT, который цитируется на странице руководства -

.

Try to minimize cache effects of the I/O to and from this file. In general this will degrade performance, but it is useful in special situations, such as when applications do their own caching. File I/O is done directly to/from user-space buffers. The O_DIRECT flag on its own makes an effort to transfer data synchronously, but does not give the guarantees of the O_SYNC flag that data and necessary metadata are transferred. To guarantee synchronous I/O, O_SYNC must be used in addition to O_DIRECT. See NOTES below for further discussion.

10
27.01.2020, 19:35

Теги

Похожие вопросы