При использовании файловой системы с закольцовыванием необходимо учитывать файловую систему, в которой она создана. В частности, ядро, скорее всего, не будет немедленно сбрасывать записанные страницы закольцовывания FS на диск содержащей файловой системы, несмотря на вызов fsync в закольцовывании fs. Эти записи могут быть sync
d в закольцовывании, но они могут находиться как грязные страницы в памяти для содержащей FS.
Теперь то, как опция nobarrier
взаимодействует с драйвером закольцовывания, а также с файловой системой, в чем я не уверен. Таким образом, я провел эксперимент. Я добавил переменную монтирования содержащей файловой системы с sync
. Результаты следующие.
(все выходы из dd, если =/dev/ноль = xfs/output bs = 32K count = 10000 conv = fsync
)
, содержащие fs асинхронный
, закольцовывание барьер
32768000 байты (33 МБ) скопированы, 0,401873 s, 81,5 МБ/с
, содержащий fs асинхронный
, закольцовывание nobarrier
32768000 байт (33 МБ) скопировано, 0,0414423 с, 791 МБ/с
, содержащий fs sync
, барьер закольцовывания
32768000 байты (33 МБ) скопированы, 71,5749 s, 458 КБ/с
содержит fs sync
, закольцовывание nobarrier
32768000 байт (33 МБ) скопировано, 70,6415 s, 464 kB/s
Скорости барьерной
и nobarrier
сильно изменяются, когда содержащий fs является асинхронным
. Однако если содержащий fs синхронизирован с sync
и не использует кэш страниц, ускорение в основном исчезает.
Вывод заключается в том, что тестирование барьера
и nobarrier
с файловой системой с закольцовыванием не будет полезным. Взаимодействие файловой системы с кэшированием ядра будет достигнуто в путь. Я подозреваю, что кэш ядра не единственная вещь, которая вызовет ошибочные результаты при тестировании производительности с использованием закольцовываний.
В обоих случаях цикл будет выполняться дважды (один раз для слова seq
и один раз для слова 10
).
Кроме того, оба будут объединять смежные пробелы и удалять начальные/конечные пробелы, так что выходные данные не обязательно будут представлять собой две копии входных данных.
Первая
#!/bin/sh
for j in $(seq 10); do
cat input
done >> output
Вторая
#!/bin/sh
i="$(cat input)"
for j in $(seq 10); do
echo "$i"
done >> output
Одна из причин, по которой эхо
медленнее, может заключаться в том, что переменная без кавычек разделяется в пробеле на отдельные слова. Для 50MB это будет большой работой. Приведите переменные!
Я предлагаю исправить эти ошибки, а затем повторно оценить время.
Я протестировал это локально. Я создал файл 50MB, используя выходные данные tar cf - | dd bs = 1M count = 50
. Я также расширил циклы, чтобы запустить с коэффициентом x100, чтобы тайминги были масштабированы до разумного значения (я добавил еще один цикл вокруг всего вашего кода: для k в $ (seq 100);
... сделано
). Вот тайминги:
time ./1.sh
real 0m5.948s
user 0m0.012s
sys 0m0.064s
time ./2.sh
real 0m5.639s
user 0m4.060s
sys 0m0.224s
Как вы видите, нет никакой реальной разницы, но если что-то содержит эхо
работает незначительно быстрее. Если я удаляю цитаты и запускаю вашу сломанную версию 2, время удваивается, показывая, что оболочке приходится выполнять гораздо больше работы, которую следует ожидать.
time ./2original.sh
real 0m12.498s
user 0m8.645s
sys 0m2.732s
-121--28360- Эхо-сигнал
предназначен для размещения на экране 1 строки. Во втором примере содержимое файла помещается в переменную, а затем печатается. В первом вы сразу выставляете контент на экран.
cat
оптимизирован для этого использования. echo
не является. Кроме того, помещение 50Mb в переменную среды не является хорошей идеей.
К сожалению, тайм-аут кажется жестким -, закодированным как 5 минут в исходном коде PolicyKit, в файле src/polkitbackend/polkitbackendinteractiveauthority.c
.
В строках 3231 -3236 написано:
/* TODO: right now the time the temporary authorization is kept is hard-coded - we
* could make it a propery on the PolkitBackendInteractiveAuthority class (so
* the local authority could read it from a config file) or a vfunc
* (so the local authority could read it from an annotation on the action).
*/
expiration_seconds = 5 * 60;
Таким образом, тайм-аут установлен в исходном коде на 5 минут, и в настоящее время нет условий для его изменения без перекомпиляции соответствующих частей PolicyKit.
С другой стороны, OpenSuSE Leap 15, кажется, расширил эту функциональность. Похоже, что -они интерпретировали действия ..._keep
как означающие «запомнить аутентификацию во время выполнения запрашивающего процесса», и добавили действия ..._keep_session
и ..._keep_always
как означающие «запомнить для всего этого конкретного сеанс входа в систему» и «запомнить навсегда» соответственно.