고정된 속도로 라인을 읽는 방법은 무엇입니까?

고정된 속도로 라인을 읽는 방법은 무엇입니까?

대용량 로그 파일을 읽고 (netbsd) netcat을 사용하여 동일한 호스트 워크스테이션에 있는 두 가상 머신 사이의 로컬 네트워크를 통해 이를 보내야 합니다.

나는 netcat에 간격이 있다는 것을 알고 있지만 내가 아는 한 사용할 수 있는 가장 작은 간격은 1줄/초입니다.

이런 식으로 보내야 하는 파일의 대부분은 수십만 줄에 달하고 일부는 백만 줄에 가까워서 초당 한 줄이 불가능합니다.

cat을 사용하면 결국 호스트/워크스테이션을 사용할 수 없게 됩니다.

bash 및 일반적인 *nix 도구를 사용하여 파일을 보내지만 5-10줄/초 또는 이와 유사한 속도로 netcat에 공급할 수 있는 방법이 있습니까?

이것의 최종 목표는 제가 고려하고 있는 중앙 집중식 로깅 데이터베이스에 대한 개념 증명 테스트를 수행할 수 있도록 하는 것입니다.

답변1

pv, 이는 다음과 같이 사용될 수 있습니다.NetBSD 패키지, 파이프의 속도를 제한할 수 있습니다.

<large_file pv -L 1k | netcat …

답변2

완벽한 도구임이 밝혀졌습니다 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] [          <=>

답변3

bash와 파이프를 사용하고 간단하지만 지저분한 솔루션을 찾고 있다면 sleep.

cat비슷하게 작동 하지만 각 줄에서 일시 중지되는 이 방법을 사용할 수 있습니다 . 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

답변4

아마도CPU 한도굉장히 유용하다. 프로세스가 사용할 수 있는 CPU 시간의 비율을 제한합니다. 대부분의 배포판에 대한 저장소에서 사용할 수 있습니다. 문제는 cat과 netcat이 CPU를 너무 적게 사용하여 효과적으로 스로틀할 수 있다는 것입니다.

관련 정보