Никакие EOF, когда программа читает свой собственный исполняемый файл на cifs, не монтируются

[117595] Такого инструмента нет, потому что он не имеет смысла с точки зрения одной программы.

В качестве ресурсов можно рассматривать CPU/HDD/RAM/swap. Эти ресурсы могут совместно использоваться операционной системой различными способами между процессами, пользователями, контекстами и т.д.

В некоторых специфических ситуациях имеет смысл сказать операционной системе, чтобы она ввела жесткие ограничения:

Не позволяйте этой программе использовать более 60% памяти.

Не позволяйте этому пользователю использовать более 20% процессорного времени, если это нужно другому пользователю. Иначе позвольте ему использовать 100% процессора.

Не позволяйте пользователям из этой группы использовать более 2 ядер.

...

Это обеспечивает реальную [118043]гибкость[118044]: ресурсы делятся между пользователями в соответствии с желаниями администратора и операционной системы.

net use S: \\SHIRE\Baggins  /USER:\ /SAVECRED /PERSISTENT:YES

Почему ручное размещение программы для подкачки не является хорошей идеей?

Вы в основном предполагаете, что вы лучше эвристики в ядре. Ядро уже само обрабатывает пространство подкачки. Если демон не был активирован долгое время и в операционной системе не хватает оперативной памяти, то в конце концов он будет помещен в swap.

AFAIK, swap не является исполняемым: перед исполнением содержимое swap должно быть извлечено в оперативную память. Так что если вы думаете о программах первого класса, выполняющихся из оперативной памяти, и программ второго класса, выполняющихся из swap: остановитесь сейчас, это не сработает.

"Да, но этот конкретный демон вызывается дважды в месяц. Мне он не нужен в оперативной памяти". Если это правда, то кернел вставит swap, если не хватает оперативной памяти.

"Зачем ждать, когда не хватает оперативной памяти?". Вкладывать и выкладывать своп очень дорого, особенно на обычном старом жестком диске. Если ваша система может хранить всё в оперативной памяти, лучше пусть так и будет. Если вы заставите что-то вставить в своп, на данный момент ваша система будет менее отзывчивой. Так как другие демоны "1-го класса", скорее всего, тоже должны выполнить некоторые операции ввода-вывода на HDD, они также будут замедлены. То же самое происходит, когда демон "2-го класса" просыпается и его нужно поместить в оперативную память.

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

Непонятно, что нужно поместить в своп с точки зрения пользовательского пространства (неядерного). Ваша программа компонована с [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].

2
22.07.2017, 04:35
2 ответа

Полный тестовый скрипт. Я не могу сообщить об ошибке, потому что мне придется заплатить за это.

#!/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
}
0
27.01.2020, 22:57

, Принимающий вас, не мог воспроизвести эту проблему с другой файловой системой на той же машине, это должна быть ошибка самбы.

, Является ли это клиентом или проблемой с сервером, что-то вроде спорного вопроса, но я предположил бы, что это имеет отношение к тому же файлу, отображаемому для выполнения и открытый для чтения, которое, вероятно, обрабатывается неправильно, потому что считанный вызов ничего не должен возвращать вне eof. Неправильные метаданные файла (т.е. размер) могут также вызвать такое поведение.

0
27.01.2020, 22:57

Теги

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