Как читать строки с фиксированной скоростью?
Мне нужно прочитать большой файл журнала и отправить его через локальную сеть, используя (netbsd) netcat между двумя виртуальными машинами на одной рабочей станции хоста.
Я знаю, что netcat имеет интервал, но, насколько я могу судить, наименьший интервал, который вы можете использовать, – 1 строка в секунду.
- Почему некоторые пакеты сброса TCP отображаются в моем журнале iptables?
- Разница между MTU для маршрута и MTU для интерфейса
- Сброс TCP после SYN ACK, возможно, связанный с "no route to host"
- Почему первые 1024 порта ограничены только пользователем root?
- Linux отбрасывает пакеты, если они получены от другого оборудования
Большинство файлов, которые мне нужно отправить таким образом, имеют сотни тысяч строк, а некоторые – около миллиона строк, поэтому одна строка в секунду невозможна.
Если я просто использую кошку, мой главный компьютер / рабочая станция завершается, увязшая до невозможности использования.
Используя bash и общие инструменты * nix, есть способ, которым я могу отправить файлы, но загружаю их в netcat со скоростью, например, 5-10 строк в секунду или что-то в этом роде?
Конечной целью этого является позволить мне сделать некоторые доказательства тестирования концепции для централизованной базы данных журнала, которую я рассматриваю.
4 Solutions collect form web for “Как читать строки с фиксированной скоростью?”
Если вы используете bash и pipe, и ищете легкое и грязное решение, вы можете попробовать использовать sleep
.
Вы можете использовать это, которое действует как cat
но с паузой в каждой строке. while read i; do echo "$i"; sleep 0.01; done
while read i; do echo "$i"; sleep 0.01; done
. Вот пример чуть менее 100 строк в секунду.
$ time (seq 1 100 | while read i; do echo "$i"; sleep 0.01; done) [...] real 0m1.224s user 0m0.012s sys 0m0.052s
pv
, который доступен в виде пакета NetBSD , позволяет ограничить скорость канала.
<large_file pv -L 1k | netcat …
Как оказалось, pv
– идеальный инструмент здесь (по крайней мере pv 1.6.0). С -l
(режим линии) флаг -L
лимиты становятся линиями.
Простые доказательства:
seq 0 1000|pv -l -L100 > /dev/null 1k 0:00:10 [99.6 /s] [ <=> seq 0 10000|pv -l -L1k > /dev/null 10k 0:00:09 [1.03k/s] [ <=>
Может быть, cpulimit полезен. Он ограничивает процентное время процессора, которое может использовать процесс. Большинство дистрибутивов доступно из репозиториев. Проблема в том, что эта кошка и netcat могут использовать слишком мало CPU, чтобы быть действительно полезными для дросселирования.