[117595] Такого инструмента нет, потому что он не имеет смысла с точки зрения одной программы.
В некоторых специфических ситуациях имеет смысл сказать операционной системе, чтобы она ввела жесткие ограничения:
Не позволяйте этой программе использовать более 60% памяти.
Не позволяйте пользователям из этой группы использовать более 2 ядер.
Это обеспечивает реальную [118043]гибкость[118044]: ресурсы делятся между пользователями в соответствии с желаниями администратора и операционной системы.
net use S: \\SHIRE\Baggins /USER:\ /SAVECRED /PERSISTENT:YES
Почему ручное размещение программы для подкачки не является хорошей идеей?
Вы в основном предполагаете, что вы лучше эвристики в ядре. Ядро уже само обрабатывает пространство подкачки. Если демон не был активирован долгое время и в операционной системе не хватает оперативной памяти, то в конце концов он будет помещен в swap.
AFAIK, swap не является исполняемым: перед исполнением содержимое swap должно быть извлечено в оперативную память. Так что если вы думаете о программах первого класса, выполняющихся из оперативной памяти, и программ второго класса, выполняющихся из swap: остановитесь сейчас, это не сработает.
"Да, но этот конкретный демон вызывается дважды в месяц. Мне он не нужен в оперативной памяти". Если это правда, то кернел вставит swap, если не хватает оперативной памяти.
Теперь, почему пользователь не может использовать волшебную командную строку, чтобы поместить программу в своп?
Непонятно, что нужно поместить в своп с точки зрения пользовательского пространства (неядерного). Ваша программа компонована с [118452]libmylib.so[118453], должна ли она также поместить это в обмен? А как насчет [118454]libc.so[118455]?
Как вы узнаете, что демон больше не используется и может быть снова безопасно помещен в обмен?
Одним словом, вам нужно ядро, чтобы обрабатывать его, и это именно то, что он делает. Для большинства нужд, подстройка подмены более чем достаточна для получения отзывчивой системы.
compiz-manager
Теперь, если вы действительно хотите.
(источник: [118457] freakoutnation.com[118458])[118067] , ядро предлагает эту "гибкость", используя [118068]cgroups[118069]. Вы можете получить то, что считаете нужным, установив max mem и max mem+swap для вашего демона в [118070]cgroups[118071]. Вы можете получить более резонансный результат, установив подкачки для каждой программы. Но в любом случае, это плохая идея и я не буду идти дальше [118072]this[118073] в качестве объяснения.[117616].
Полный тестовый скрипт. Я не могу сообщить об ошибке, потому что мне придется заплатить за это.
#!/bin/bash
set -e
# systemd
#SMB_START="systemctl start smbd.service nmbd.service"
#SMB_RELOAD="systemctl reload smbd.service"
# initscripts
SMB_START="service smb start"
SMB_RELOAD="service smb reload"
cleanup() {
echo cleanup... >&2
sed -i -n -e "/# added by test-samba-bug BEGIN/b m10; p; b" -e :m10 -e n -e "/# added by test-samba-bug END/b" -e "b m10" /etc/samba/smb.conf
umount -f /tmp/test-samba-bug-mnt 2>/dev/null || true
rm -rf /tmp/test-samba-bug /tmp/test-samba-bug-mnt
}
cleanup
trap cleanup EXIT
mkdir -p /tmp/test-samba-bug /tmp/test-samba-bug-mnt
chcon -R -t samba_share_t /tmp/test-samba-bug 2>/dev/null || true
>>/etc/samba/smb.conf cat <<EOF
# added by test-samba-bug BEGIN
[test-samba-bug]
path = /tmp/test-samba-bug
public = yes
# added by test-samba-bug END
EOF
# service smb stop
$SMB_START
$SMB_RELOAD
mount -t cifs -oguest //localhost/test-samba-bug /tmp/test-samba-bug-mnt
command cp /bin/dd /tmp/test-samba-bug/
DD=/tmp/test-samba-bug-mnt/dd
#$DD bs=131071 if=$DD of=/dev/null count=20
$DD bs=131072 if=$DD of=/tmp/test-samba-bug/copied count=20
echo comparing copied file contents
cmp /bin/dd /tmp/test-samba-bug/copied || {
echo "test failed" >&2
exit 1
}
, Принимающий вас, не мог воспроизвести эту проблему с другой файловой системой на той же машине, это должна быть ошибка самбы.
, Является ли это клиентом или проблемой с сервером, что-то вроде спорного вопроса, но я предположил бы, что это имеет отношение к тому же файлу, отображаемому для выполнения и открытый для чтения, которое, вероятно, обрабатывается неправильно, потому что считанный вызов ничего не должен возвращать вне eof. Неправильные метаданные файла (т.е. размер) могут также вызвать такое поведение.