rperf 는 3D-P에서 개발한 Rust 기반 iperf 대안으로, iperf3 에서 발견되는 일부 신뢰성 및 일관성 문제를 방지하는 동시에 손실 허용성, IoT와 유사한 환경에서의 작동에 중점을 두고 더 풍부한 측정 데이터를 제공하는 것을 목표로 합니다. iperf 를 거의 대체할 수 있고 그렇게 하면 이점이 있을 수 있지만 폐쇄 네트워크의 모니터링 용량에서 주기적인 데이터 수집에 중점을 두므로 모든 도메인에 적합하지는 않습니다. 그 iperf가 서비스를 제공할 수 있습니다.
rperf 는 iperf3 및 zapwireless 의 알고리즘을 참조하여 정확성을 평가하고 적절한 수정 사항을 도출하는 독립적인 구현이지만 어느 쪽에서도 코드를 복사하지 않습니다.
특히 iperf3 에서 해결된 가장 중요한 문제는 다음과 같습니다.
특정 서버에서는 여러 동시 클라이언트가 지원됩니다.
스트리밍 지터 계산을 위한 rperf 의 RFC 1889 구현은 시퀀스의 첫 번째 패킷과 두 번째 패킷 사이의 델타를 가정하고 시퀀스의 간격으로 인해 카운트가 재설정된다는 가정으로 시작됩니다. 이에 비해 iperf3는 0으로 시작해서 인위적으로 낮은 값을 만들어내고, 갭이 생기면 그냥 순진하게 계속해서 인위적으로 높은 값을 만들어낸다.
UDP 교환에서는 중복된 패킷이 고려되고 순서가 잘못된 패킷은 독립적인 이벤트로 계산됩니다.
모든 트래픽은 정기적인 1초 미만 간격으로 비례적으로 방출될 수 있으므로 실제 데이터 전송 및 전송 알고리즘을 보다 정확하게 반영하는 구성이 가능합니다.
스트림 구성 및 결과는 전용 연결을 통해 교환되며 모든 데이터 경로에는 시간 초과, 완료 및 실패 의미가 명확하게 정의되어 있으므로 키 패킷이 손실될 때 테스트 양쪽에서 실행이 무기한 중단되지 않습니다.
rperf 의 JSON 출력은 구조적으로 합법적입니다. 인용되지 않은 문자열, 반복되는 키 또는 매달린 쉼표는 사용하기 전에 사전 처리가 필요하거나 예상치 못한 오류를 발생시킬 수 없습니다.
zapwireless 와 달리 다음과 같은 개선 사항이 실현되었습니다.
rperf는 클래식 클라이언트-서버 아키텍처를 사용하므로 테스트 실행 요청을 기다리는 장치에서 실행 중인 프로세스를 유지할 필요가 없습니다.
지터가 계산됩니다.
IPv6이 지원됩니다.
테스트의 일부로 여러 스트림을 병렬로 실행할 수 있습니다.
결과에서 TCP 램프업 시간을 삭제하기 위해 omit
옵션을 사용할 수 있습니다.
보다 쉬운 원격 측정 수집을 위해 출력이 JSON으로 제공됩니다.
rperf는 모든 주요 플랫폼에서 구축하고 작동해야 하지만, 개발 및 사용에 초점을 맞춘 것은 Linux 기반 시스템이므로 기능이 가장 완벽할 것입니다.
다른 시스템과 동등한 기능을 구현하기 위한 풀 요청을 환영합니다.
모든 것이 --help
출력에 요약되어 있으며 유사한 도구에 익숙한 대부분의 사용자는 즉시 편안함을 느낄 것입니다.
rperf는 iperf3 과 매우 유사하게 작동하며 많은 개념과 명령줄 플래그까지 공유합니다. 한 가지 주요 차이점은 클라이언트가 모든 구성 프로세스를 주도하는 반면 서버는 최선을 다해 결과 스트림을 제공한다는 것입니다. 이는 서버가 인터페이스를 통해 직접 테스트 결과를 제공하지 않으며 TCP 및 UDP 테스트가 동일한 인스턴스에 대해 잠재적으로 많은 클라이언트에 의해 동시에 실행될 수 있음을 의미합니다.
일반 작동 모드에서 클라이언트는 데이터를 서버에 업로드합니다. reverse
플래그가 설정되면 클라이언트는 데이터를 수신합니다.
iperf3 과 달리 rperf는 기본적으로 예약된 포트 범위를 사용하지 않습니다. 이는 실질적으로 소수의 연속 포트만 있을 수 있는 리소스 경합 없이 임의 수의 클라이언트를 병렬로 지원할 수 있도록 하기 위한 것입니다. 의도된 용량에서는 문제가 되지 않지만 비허용 방화벽 및 NAT 설정과 관련된 경우 --tcp[6]-port-pool
및 --udp[6]-port-pool
옵션이 필요할 수 있습니다. 트래픽을 수신하는 데 사용될 세트에 비연속 포트를 할당하는 데 사용됩니다.
고정된 양의 데이터를 기준으로 처리량을 테스트한다는 개념도 없습니다. 오히려 대략적으로 알려진 기간 동안의 처리량을 측정하는 데만 초점을 맞춥니다.
또한 관련성은 서버가 IPv6 모드에서 실행되고 해당 호스트가 이중 스택 구성에서 IPv4 매핑을 지원하는 경우 IPv4 및 IPv6 클라이언트가 모두 동일한 인스턴스에 연결할 수 있다는 것입니다.
rperf는 화물을 사용합니다. 일반적인 프로세스는 간단하게 cargo build --release
입니다.
Cargo-deb 도 지원되며 기본적으로 비활성화된 rperf
systemd 서비스를 설치하는 사용 가능한 데비안 패키지를 생성합니다. 시작되면 기본적으로 IPv6 지원을 가정하여 nobody:nogroup
으로 실행됩니다.
동시대 제품과 마찬가지로 rperf 의 핵심 개념은 미리 정해진 목표 속도로 IP 대상에 TCP 또는 UDP 데이터 스트림을 발사하는 것입니다. 실제로 수신된 데이터의 양을 관찰하여 네트워크 링크의 용량을 측정하는 데 사용됩니다.
해당 도메인 내에서 교환 품질에 대한 추가 데이터가 수집되어 검토용으로 제공됩니다.
구조적으로 rperf는 클라이언트가 서버에 대한 TCP 연결을 설정하도록 한 후 클라이언트가 수행할 테스트에 대한 세부 정보를 보내고 서버는 전체 테스트 프로세스 동안 관찰 결과를 클라이언트에 보고합니다.
클라이언트는 테스트를 위해 여러 병렬 스트림을 사용하도록 요청할 수 있습니다. 이는 양쪽에 자체 전용 스레드가 있는 여러 TCP 연결 또는 UDP 소켓을 설정함으로써 용이해지며, 이는 페이지의 영향을 줄이기 위해 단일 논리적 CPU 코어에 추가로 고정될 수 있습니다. - 데이터 교환에 오류가 있습니다.
클라이언트-서버 관계는 피어에 가까운 iperf3 및 각 참가자가 자체 데몬을 실행하고 세 번째 프로세스가 통신을 조정하는 zapwireless 와 달리 이 설계의 매우 핵심적인 측면으로 처리됩니다.
특히 모든 데이터 수집, 계산 및 표시는 클라이언트 측에서 이루어지며 서버는 관찰한 내용을 단순히 반환합니다. 이는 특히 시간과 관련하여 기록에 일부 드리프트가 발생할 수 있습니다(서버 간격이 해당 클라이언트 값보다 몇 밀리초 더 긴 것은 전혀 드문 일이 아닙니다). 그러나 연결이 끊어지지 않았다고 가정하면 관찰된 데이터의 총계는 모든 작동 모드에서 일치합니다.
서버는 세 가지 스레딩 계층을 사용합니다. 하나는 기본 스레드용이고, 다른 하나는 서비스 중인 각 클라이언트용이며, 또 다른 하나는 클라이언트와 통신하는 각 스트림용입니다. 클라이언트 측에서 메인 스레드는 서버와 통신하는 데 사용되며 서버와 통신하는 각 스트림에 대해 추가 스레드를 생성합니다.
서버가 클라이언트로부터 요청을 받으면 해당 클라이언트의 특정 요청을 처리하는 스레드를 생성합니다. 내부적으로 테스트의 각 스트림은 양쪽에 반복자와 유사한 핸들러를 생성합니다. 클라이언트와 서버 모두 테스트 기간이 끝날 때까지 서로 비동기적으로 반복기 아날로그를 실행합니다. 이 시점에서 보낸 사람은 스트림 내에서 완료를 나타냅니다.
스트림 수준에서 연결 끊김 가능성을 안정적으로 처리하기 위해 정기적으로 서버에서 테스트 결과를 전송하는 클라이언트-서버 스트림의 연결 유지 메커니즘은 몇 초 동안 활동이 없으면 대기 중인 연결을 종료합니다.
호스트 OS의 TCP 및 UDP 메커니즘은 일부 조정 매개변수가 노출된 상태에서 교환되는 모든 실제 트래픽에 사용됩니다. 이 접근 방식은 실제 애플리케이션이 작동하는 방식을 가장 정확하게 나타내기 때문에 레이어 2 또는 레이어 3 위에 사용자 공간 구현을 통해 선택되었습니다.
JSON 직렬화된 간격 데이터에 표시되는 "타임스탬프" 값은 호스트 기준이므로 환경의 시스템 시계 정확도가 매우 높지 않는 한 전송 타임스탬프는 다른 전송 타임스탬프와만 비교해야 하며 수신 타임스탬프도 마찬가지입니다. 그러나 일반적으로 이 데이터는 정확성 검증 외에는 유용하지 않습니다.
각 교환 간격 동안 스트림에 기록된 양이 대역폭 목표를 충족하거나 초과할 때까지 한 번에 length
바이트를 보내려고 시도합니다. 이 시점에서 보낸 사람은 다음 간격이 시작될 때까지 침묵합니다. 일정 간격 내에 전송된 데이터는 해당 기간 동안 균일하게 배포되어야 합니다.
스트림 인덱스는 1
아닌 0
에서 시작합니다. 이는 누구도 놀라지 않을 것이지만 보고서에 "스트림 0"이 표시되는 것은 걱정할 필요가 없습니다.
rperf는 Evtech Solutions, Ltd., dba 3D-P에서 GNU GPL 버전 3에 따라 배포되며 해당 텍스트는 COPYING
에서 찾을 수 있습니다.
저작권 세부 정보, 저작권 세부 사항 및 양도 가능성에 대한 정보는 소스 코드 자체에 나와 있습니다.