Хотели опубликовать ответ на этот вопрос на случай, если кто-то увидит аналогичный запутанный результат. Похоже, у меня было две проблемы:
Необходимо использовать # процессоров на хосте, а не # доступных процессоров в cgroups cpuset для оценки пропускной способности процессора:
(количество процессоров на хосте) * (cpu.cfs_period_us) * (.25), поэтому 40 * 100000 * .25 = 1000000
Мой прогон stress-ng внутри контейнера использовал контроллеры cpu и cpuset cgroup / lxc / foo, в то время как запуск stress-ng за пределами контейнер использовал cgroup /system/sshd.service
Чтобы лучше смоделировать мое реальное приложение, я должен был указать, какие контроллеры использовать, используя cgexec :
$ cgexec -g cpuset:/lxc/foo -g cpu:/lxc/foo ./stress-ng --cpu-load 100 -c 48 --times --timeout 10s --metrics-brief
stress-ng: info: [6252] dispatching hogs: 48 cpu
stress-ng: info: [6252] successful run completed in 10.36s
stress-ng: info: [6252] stressor bogo ops real time usr time sys time bogo ops/s bogo ops/s
stress-ng: info: [6252] (secs) (secs) (secs) (real time) (usr+sys time)
stress-ng: info: [6252] cpu 11152 10.09 102.83 0.12 1105.60 108.32
stress-ng: info: [6252] for a 10.36s run time:
stress-ng: info: [6252] 414.46s available CPU time
stress-ng: info: [6252] 102.85s user time ( 24.82%)
stress-ng: info: [6252] 0.12s system time ( 0.03%)
stress-ng: info: [6252] 102.97s total time ( 24.84%)
rsync
имеет возможность ограничивать пропускную способность; например
- bwlimit = 1
составляет 1 кибибайт в секунду. Используйте суффикс K M или G для умножения числа, по умолчанию K. На странице руководства говорится о сокетах, но это применимо и к локальным копиям.
Вы можете попробовать запустить sudo smartctl -a / dev / sdx
на вашем диске sd x , чтобы увидеть, есть ли какие-либо признаки перегрева, хотя не все диски и шины реализуют SMART.
Вы можете попробовать hdparm -M 128
(проверьте свою версию этой команды на странице руководства)на вашем диске, чтобы выполнить акустическое управление , которое должно замедлить движение головы, чтобы уменьшить шум, но также и нагрев.
Не особо элегантно, но вы можете запустить команду копирования, а затем запустить цикл, который приостанавливает ее, скажем, на 3 минуты каждые 20 минут:
Запустите команду копирования в background
cp -r / path / to / dir / path / to / external / drive &
Запустите этот цикл, который остановит / перезапустит его:
while ps -p $! > / dev / null; сделать
kill -SIGCONT $ !;
сна 20м;
kill -s SIGSTOP $ !;
сон 3м;
готово
Я придумал один способ. К сожалению, он не возобновляется, поэтому предполагается, что вы не против оставить свой компьютер включенным. Тоже не проверял.
РЕДАКТИРОВАТЬ: ох, исправленный ответ Тердона намного лучше.
SRC=src # source directory
DEST=dest # target directory
LOCKFILE=/var/tmp/copy.lock
BATCH_LEN=5m # 5 minutes
BATCH_DELAY=5m
touch "$LOCKFILE"
(cd "$SRC" && tar -cf - .) |
(cd "$TMP" && while [ -e "$LOCKFILE" ]; do
dd bs=4K & (sleep $BATCH_LEN; kill %1 >/dev/null)
sleep $BATCH_DELAY
done) |
(cd "$DEST" && tar -xpf - ; rm "$LOCKFILE")