I want to limit the use of swap space (not its size just the usage).
В Solaris нельзя ограничить резервирование подкачки.
Практически каждому байту ОЗУ, используемому процессом, Solaris гарантирует доступное постоянное резервное хранилище. (В Solaris есть некоторые исключения, например, некоторые типы разделяемой памяти, для которых не требуется резервирование подкачки, поскольку они не могут быть выгружены. Эти функции используются в таких реализациях, как SGA базы данных Oracle.)
Отображенные в память -файлы, такие как исполняемые файлы и общие объекты, обычно используют фактический файл на диске в качестве резервного хранилища и, таким образом, вообще не используют пространство подкачки. Для большинства других применений памяти требуется резервное хранилище. Например, если процесс запрашивает у ядра 2 ГБ кучи, но фактически никогда ее не использует, это приведет к резервированию 2 ГБ для пространства подкачки, поскольку Solaris гарантирует, что если процесс запрашивает память, он ее получит. Нет убийцы OOM, который убивает ваш процесс базы данных на вашем сервере рабочей базы данных или ваш веб-сервер на вашем онлайн-сервере, обрабатывающем заказы клиентов...
В Solaris, если вы запросите память, а ядро скажет, что вы можете ее получить, вы ее получите. Даже если вы на самом деле не используете его до тех пор, пока не пройдет долгий-долгий период времени. Это означает, что если вы попросите об этом, ядро должно убедиться, что есть место для его размещения, если его по какой-либо причине придется заменить в будущем.
Работа в соответствии с парадигмой «Я сказал, что вы можете иметь эту память, и это означает, что вы сможете получить к ней доступ независимо от того, что» вместо парадигмы «Я сказал, что вы можете получить эту память память, но я солгал вам, и теперь, когда вы попытались ее использовать, я вас убью», и эта стоимость может показаться непомерным использованием подкачки.
Чтобы просмотреть использование подкачки процессом, вы можете использовать команду pmap -S
:
bash-4.1$ pmap -S $$
4622: /usr/bin/bash
Address Kbytes Swap Mode Mapped File
0000000000400000 1412 - r-x---- bash
0000000000571000 40 40 rw----- bash
000000000057B000 24 24 rw----- bash
0000000EC09E6000 236 236 rw----- [ heap ]
00007FF0C8590000 304 - r-x---- libcurses.so.1
00007FF0C85EC000 20 20 rw----- libcurses.so.1
00007FF0C85F1000 16 16 rw----- libcurses.so.1
00007FF0C8600000 6756 - r-x---- en_US.UTF-8.so.3
00007FF0C8CA9000 8 8 rw----- en_US.UTF-8.so.3
00007FF0C8CD0000 32 - r-x---- libgen.so.1
00007FF0C8CE8000 4 4 rw----- libgen.so.1
00007FF0C8CF0000 64 64 rwx---- [ anon ]
00007FF0C8D10000 64 64 rwx---- [ anon ]
00007FF0C8D2D000 4 - rwxs--- [ anon ]
00007FF0C8D30000 64 - r-x---- methods_unicode.so.3
00007FF0C8D40000 4 4 rw----- methods_unicode.so.3
00007FF0C8D50000 24 24 rwx---- [ anon ]
00007FF0C8D60000 1816 - r-x---- libc.so.1
00007FF0C8F36000 68 68 rw----- libc.so.1
00007FF0C8F47000 8 8 rw----- libc.so.1
00007FF0C8F50000 64 64 rw----- [ anon ]
00007FF0C8F6C000 352 - r-x---- ld.so.1
00007FF0C8FD4000 16 16 rwx---- ld.so.1
00007FF0C8FD8000 4 4 rwx---- ld.so.1
FFFF80E6271AF000 20 20 rw----- [ stack ]
---------------- ---------- ----------
total Kb 11424 684
Обратите внимание на эту строку:
0000000000400000 1412 - r-x---- bash
Столбец Swap
указывает, что конкретное отображение памяти вообще не требует использования подкачки. Это часть исполняемого файла bash
, которая поддерживается самим файлом /usr/bin/bash
на диске -.
Но эта строка:
0000000000571000 40 40 rw----- bash
использует 40 КБ подкачки. Вероятно, это сегмент данных, сопоставленный с /usr/bin/bash
, но поскольку это изменяемые данные (, обратите внимание на rw
разрешения ), резервное хранилище не может быть не -изменяемым /usr/bin/bash
дисковым файлом, поэтому он получает резервирование подкачки 40 КБ.
Обратите внимание, что все отображения heap
, anon
и stack
полностью поддерживаются пространством подкачки.
Итог:
В Solaris, если вы не хотите израсходовать все свое пространство подкачки до такой степени, что вы не сможете запускать новые процессы, не делайте так, чтобы ваши процессы запрашивали память, которую они на самом деле не используют.
Или сделайте раздел подкачки большего размера.
Предварительно -исправьте поврежденный файл перед его выполнением:
#!/bin/bash
dos2unix script.py
./script.py
Для интерактивного использования используйте скрипт-оболочку, чтобы исправить файл перед его выполнением. Создайте имя файла run_broken_file.sh
со следующим содержимым:
#!/bin/bash
dos2unix "$1"
"$@"
А потом можешь бежать./run_broken_file.sh./script.py arg1 arg2 arg3
Пробный запуск:
$ unix2dos script.py
unix2dos: converting file script.py to DOS format...
$./script.py
/usr/bin/env: ‘python3\r’: No such file or directory
$ cat -A script.py
#!/usr/bin/env python3^M$
import sys^M$
print(f"hello {sys.argv}")^M$
$ cat run_broken_file.sh
#!/bin/bash
dos2unix "$1"
"$@"
$./run_broken_file.sh./script.py arg1 arg2 'arg3 with spaces'
dos2unix: converting file./script.py to Unix format...
hello ['./script.py', 'arg1', 'arg2', 'arg3 with spaces']