Alat benchmark DNS baris perintah yang dibuat untuk menguji tekanan dan mengukur kinerja server DNS dengan perangkat keras komoditas. Alat ini biasanya menggunakan ~30kB per koneksi bersamaan dan dapat mempertahankan ~30.000 QPS per inti modern jika server, OS, dan jaringan Anda memungkinkan Anda mencapai tingkat konkurensi yang sesuai.
DNStrace melewati penyelesai OS dan disediakan sebagai biner statis bawaan paket Docker. Pengukuran latensi dasar, pemeriksaan hasil, dan histogram didukung. Saat ini, hanya pertanyaan A
, AAAA
dan TXT
yang didukung.
$ 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.
Meskipun dnstrace
berguna untuk menguji latensi bolak-balik melalui jaringan publik, kode ini terutama dibuat untuk menyediakan alat gaya apachebench untuk menguji infrastruktur Anda sendiri.
Oleh karena itu, sangat mudah untuk membuat beban DNS yang signifikan dengan pengaturan non-default. Jangan lakukan ini pada layanan DNS publik . Kemungkinan besar Anda akan menandai IP Anda.
go get github.com/redsift/dnstrace
akan menginstal biner di $GOPATH/bin
Anda. Pada OS-X, biner asli akan mengungguli container Docker di bawahnya yang berjalan di bawah HyperKit secara signifikan, misalnya throughput 30% lebih banyak, latensi 30% lebih rendah, dan penurunan penyebaran waktu sebesar 4x
Alat ini tersedia dalam gambar bawaan.
docker run redsift/dnstrace --help
Jika pengaturan pengujian lokal memungkinkan Anda mencapai 50 ribu QPS ke atas, Anda dapat mengharapkan jaringan buruh pelabuhan menambahkan ~2% overhead ke throughput dan ~8% berarti latensi (diuji pada Linux Docker 1.12.3). Jika ini penting untuk tujuan Anda, Anda mungkin ingin menjalankannya dengan --net=host
./dnstrace --completion-script-bash
dan ./dnstrace --completion-script-zsh
akan membuat skrip penyelesaian shell.
misalnya
$ 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
Saat Anda mendekati ribuan koneksi bersamaan di OS-X, Anda mungkin mengalami kesalahan koneksi karena pegangan file atau thread tidak mencukupi. Hal ini mungkin disebabkan oleh batasan proses, jadi ingatlah untuk menyesuaikan batasan ini jika Anda ingin meningkatkan tingkat konkurensi melebihi 1000.
Perhatikan bahwa menggunakan sudo ulimit
akan membuat shell root, menyesuaikan batasnya, dan kemudian keluar tanpa menimbulkan efek nyata. Sebagai gantinya gunakan launchctl
terlebih dahulu di OS-X.
$ sudo launchctl limit maxfiles 1000000 1000000 $ ulimit -n 12288
Untuk jangka panjang, pengguna dapat mengirim SIGHUP melalui kill -1 pid
untuk mengetahui jumlah kemajuan saat ini.
$ 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