CentOS 5.6
NFS смонтирована на сервере для резервного копирования дискового пространства. Когда задание резервного копирования началось, оно могло достигать 80 МБ / с, и мы действительно не ожидали, что это потребует такой большой пропускной способности. Поэтому мне нужно найти способ ограничить скорость записи в NFS.
Я попытался rsync с участием --bwlimit = 5000. Тем не менее, он ограничивал скорость чтения, но накопленные данные по-прежнему записывались со скоростью 80 МБ / с, а операции записи в течение нескольких секунд не выполнялись.
Есть ли способ ограничить скорость записи NFS?
NFS не предоставляет метода ограничения полосы пропускания, используемой клиентом.
Поведение, которое вы видите, когда данные накапливаются и затем записываются на полной скорости, - это то, что грязные страницы растут на клиенте, а затем сбрасываются на сервер NFS. Это ожидаемый способ работы ввода-вывода.
На клиенте Linux NFS вы можете использовать tc
для согласования и контроля трафика. Это было бы так же просто, как создать класс с IP-адресом сервера NFS в качестве пункта назначения и ограничить этот класс.
Это описано в Linux Advanced Routing & Traffic Control HOWTO, особенно в главе 9 Дисциплины очередей для управления пропускной способностью и внутри man tc
.
Вот пример точных команд для использования: http://iomem.com/archives/17-Rate-limiting-with-sch_htb.html
Извините за открытие такой старой темы, но я написал небольшой скрипт для ограничения передачи скорости с помощью pv
команда, она также работает через NFS. Единственное, чего я еще не преодолел, это падение скорости, это происходит только когда я использую NFS поверх sshfs, все в порядке.
Конфигурация NFS моего сервера (экспорт):
rw,sync,no_subtree_check
И конфигурация клиента (варианты монтирования):
rsize=8192,wsize=8192,timeo=14,intr,_netdev,noauto,hard,sync
Вот мой сценарий:
#!/bin/bash
# Simple Script to mv files OR folders at $3 BPS
tor_path="$1"
mv_dir="$2"
speed="$3"
tor_dir="$(basename "$tor_path")"
file=""
tlines=""
cnt=""
file=""
[[ "$mv_dir" != *"/" ]] && mv_dir=""$mv_dir"/"
if [[ -f "$tor_path" ]] && [[ -d "$mv_dir" ]]
then
pv -L "$speed" "$tor_path" > "$mv_dir""$tor_dir"
elif [[ -d "$tor_path" ]] && [[ -d "$mv_dir" ]]
then
tor_files="$(mktemp --tmpdir tor_files.XXXXXX)"
[[ "$tor_path" != *"/" ]] && tor_path=""$tor_path"/"
find "$tor_path" -type d > "$tor_files"
sed 's#'"$tor_path"'#'"$tor_dir"'/#g; s###g' -i "$tor_files"
tlines="$(wc -l < "$tor_files")"
cnt=0
while [ "$cnt" -lt "$tlines" ]
do
let cnt++
file="$(head -n $cnt $tor_files | tail -1)"
mkdir "$mv_dir""$file"
done
find "$tor_path" -type f > "$tor_files"
sed 's#'"$tor_path"'#'"$tor_dir"'/#g' -i "$tor_files"
tlines="$(wc -l < "$tor_files")"
cnt=0
while [ "$cnt" -lt "$tlines" ]
do
let cnt++
file="$(head -n $cnt $tor_files | tail -1)"
pv -L "$speed" "$tor_path""$(basename "$file")" > "$mv_dir""$file"
done
rm "$tor_files"
else
exit 1
fi