상용 하드웨어를 사용하여 DNS 서버의 성능을 스트레스 테스트하고 측정하기 위해 구축된 명령줄 DNS 벤치마크 도구입니다. 이 도구는 일반적으로 동시 연결당 최대 30kB를 소비하며 서버, OS 및 네트워크에서 적절한 동시성 수준에 도달할 수 있는 경우 최신 코어당 최대 30,000 QPS를 유지할 수 있습니다.
DNStrace는 OS 확인자를 우회하며 Docker 패키지로 사전 빌드된 정적 바이너리로 제공됩니다. 기본 대기 시간 측정, 결과 확인 및 히스토그램이 지원됩니다. 현재는 A
, AAAA
및 TXT
질문만 지원됩니다.
$ dnstrace --help usage: dnstrace [<flags>] <queries>... A DNS benchmark. Flags: --help Show context-sensitive help (also try --help-long and --help-man). -s, --server="127.0.0.1" DNS server IP:port to test. -t, --type=A Query type. -n, --number=1 Number of queries to issue. Note that the total number of queries issued = number*concurrency*len(queries). -c, --concurrency=1 Number of concurrent queries to issue. -l, --rate-limit=0 Apply a global questions / second rate limit. -e, --expect=EXPECT ... Expect a specific response. -r, --recurse Allow DNS recursion. --edns0=0 Enable EDNS0 with specified size. --tcp Use TCP fot DNS requests. --write=1s DNS write timeout. --read=4s DNS read timeout. --codes Enable counting DNS return codes. --min=400µs Minimum value for timing histogram. --max=4s Maximum value for histogram. --precision=[1-5] Significant figure for histogram precision. --distribution Display distribution histogram of timings to stdout. --csv=/path/to/file.csv Export distribution to CSV. --io-errors Log I/O errors to stderr. --silent Disable stdout. --color ANSI Color output. --version Show application version. Args: <queries> Queries to issue.
dnstrace
공용 네트워크를 통한 왕복 대기 시간을 테스트하는 데 유용하지만 코드는 주로 자체 인프라를 테스트하기 위한 Apachebench 스타일 도구를 제공하기 위해 생성되었습니다.
따라서 기본 설정이 아닌 경우 상당한 DNS 부하를 생성하는 것은 매우 쉽습니다. 공용 DNS 서비스에는 이 작업을 수행하지 마십시오 . 귀하의 IP에 플래그를 지정할 가능성이 높습니다.
go get github.com/redsift/dnstrace
$GOPATH/bin
에 바이너리가 설치됩니다. OS-X에서 기본 바이너리는 HyperKit에서 실행되는 아래 Docker 컨테이너보다 성능이 훨씬 뛰어납니다. 예를 들어 처리량은 30% 증가하고 대기 시간은 30% 낮으며 타이밍 확산은 4배 감소합니다.
이 도구는 사전 빌드된 이미지로 제공됩니다.
docker run redsift/dnstrace --help
로컬 테스트 설정으로 50,000 QPS 이상에 도달할 수 있는 경우 Docker 네트워킹으로 인해 처리량에 ~2%의 오버헤드가 추가되고 대기 시간에 ~8%가 추가될 것으로 예상할 수 있습니다(Linux Docker 1.12.3에서 테스트됨). 이것이 귀하의 목적에 중요한 경우 --net=host
사용하여 실행할 수 있습니다.
./dnstrace --completion-script-bash
및 ./dnstrace --completion-script-zsh
쉘 완성 스크립트를 생성합니다.
예를 들어
$ eval "$(./dnstrace --completion-script-zsh)" $ ./dnstrace --concurrency --codes --distribution --io-errors --precision --server --version --color --edns0 --max --rate-limit --silent --write --concurrency --expect --min --read --tcp --csv --help --number --recurse --type
OS-X에서 수천 개의 동시 연결에 접근하면 파일 핸들이나 스레드가 부족하여 연결 오류가 발생할 수 있습니다. 이는 프로세스 제한으로 인한 것일 수 있으므로 동시성 수준을 1000 이상으로 높이려는 경우 이러한 제한을 조정해야 합니다.
sudo ulimit
를 사용하면 루트 셸이 생성되고 제한이 조정된 다음 종료되어 실제 효과가 발생하지 않습니다. 대신 OS-X에서 먼저 launchctl
사용하세요.
$ sudo launchctl limit maxfiles 1000000 1000000 $ ulimit -n 12288
장기간 실행하는 경우 사용자는 kill -1 pid
통해 SIGHUP을 보내 현재 진행률을 얻을 수 있습니다.
$ docker run redsift/dnstrace -n 10 -c 10 --server 8.8.8.8 --recurse redsift.io Benchmarking 8.8.8.8:53 via udp with 10 conncurrent requests Total requests: 100 of 100 (100.0%) DNS success codes: 100 DNS response codes NOERROR: 100 Time taken for tests: 107.091332ms Questions per second: 933.8 DNS timings, 100 datapoints min: 3.145728ms mean: 9.484369ms [+/-sd]: 5.527339ms max: 27.262975ms DNS distribution, 100 datapoints LATENCY | | COUNT +-------------+---------------------------------------------+-------+ 3.276799ms | ▄▄▄▄▄▄▄▄ | 2 3.538943ms | ▄▄▄▄▄▄▄▄▄▄▄▄ | 3 3.801087ms | ▄▄▄▄▄▄▄▄▄▄▄▄ | 3 4.063231ms | ▄▄▄▄▄▄▄▄▄▄▄▄ | 3 4.325375ms | ▄▄▄▄▄▄▄▄ | 2 4.587519ms | | 0 4.849663ms | | 0 5.111807ms | ▄▄▄▄ | 1 5.373951ms | ▄▄▄▄ | 1 5.636095ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 4 5.898239ms | ▄▄▄▄▄▄▄▄▄▄▄▄ | 3 6.160383ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 5 6.422527ms | ▄▄▄▄▄▄▄▄▄▄▄▄ | 3 6.684671ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 5 6.946815ms | ▄▄▄▄▄▄▄▄ | 2 7.208959ms | ▄▄▄▄ | 1 7.471103ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 9 7.733247ms | ▄▄▄▄▄▄▄▄ | 2 7.995391ms | ▄▄▄▄▄▄▄▄ | 2 8.257535ms | ▄▄▄▄▄▄▄▄▄▄▄▄ | 3 8.650751ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 5 9.175039ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 11 9.699327ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 6 10.223615ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 4 10.747903ms | ▄▄▄▄ | 1 11.272191ms | ▄▄▄▄ | 1 11.796479ms | | 0 12.320767ms | | 0 12.845055ms | | 0 13.369343ms | | 0 13.893631ms | ▄▄▄▄ | 1 14.417919ms | ▄▄▄▄ | 1 14.942207ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 5 15.466495ms | | 0 15.990783ms | ▄▄▄▄ | 1 16.515071ms | | 0 17.301503ms | | 0 18.350079ms | | 0 19.398655ms | ▄▄▄▄ | 1 20.447231ms | ▄▄▄▄▄▄▄▄ | 2 21.495807ms | ▄▄▄▄ | 1 22.544383ms | | 0 23.592959ms | | 0 24.641535ms | ▄▄▄▄ | 1 25.690111ms | ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ | 4 26.738687ms | ▄▄▄▄ | 1