เครื่องมือวัดประสิทธิภาพ DNS แบบบรรทัดคำสั่งที่สร้างขึ้นเพื่อทดสอบความเครียดและวัดประสิทธิภาพของเซิร์ฟเวอร์ DNS ด้วยฮาร์ดแวร์สินค้าโภคภัณฑ์ โดยทั่วไปเครื่องมือนี้จะใช้ ~30kB ต่อการเชื่อมต่อพร้อมกัน และสามารถรักษา ~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 ไบนารีดั้งเดิมจะมีประสิทธิภาพเหนือกว่าคอนเทนเนอร์ Docker ด้านล่างที่ทำงานภายใต้ HyperKit อย่างมาก เช่น ปริมาณงานเพิ่มขึ้น 30% เวลาแฝงลดลง 30% และการกระจายเวลาลดลง 4 เท่า
เครื่องมือนี้มีอยู่ในอิมเมจที่สร้างไว้ล่วงหน้า
docker run redsift/dnstrace --help
หากการตั้งค่าการทดสอบในเครื่องของคุณช่วยให้คุณมี QPS ได้ถึง 50,000 QPS ขึ้นไป คุณสามารถคาดหวังได้ว่าเครือข่ายนักเทียบท่าจะเพิ่มโอเวอร์เฮด ~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 คุณอาจพบข้อผิดพลาดในการเชื่อมต่อเนื่องจากตัวจัดการไฟล์หรือเธรดไม่เพียงพอ อาจเนื่องมาจากขีดจำกัดของกระบวนการ ดังนั้นอย่าลืมปรับขีดจำกัดเหล่านี้ หากคุณต้องการเพิ่มระดับการทำงานพร้อมกันเกิน 1,000
โปรดทราบว่าการใช้ sudo ulimit
จะสร้างรูทเชลล์ ปรับขีดจำกัด จากนั้นจึงออก ทำให้ไม่มีผลกระทบที่แท้จริง ใช้ launchctl
ก่อนบน OS-X แทน
$ sudo launchctl limit maxfiles 1000000 1000000 $ ulimit -n 12288
สำหรับการรันระยะยาว ผู้ใช้สามารถส่ง SIGHUP ผ่าน kill -1 pid
เพื่อรับการนับความคืบหน้าในปัจจุบัน
$ 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