After reading blog posts from BunnyCDN and Ctrl blog on the varying performance on top-level domains — I got curious on how .no would perform.

Daniel Aleksandersen from Ctrl blog wrote that he used points earned from his RIPE Atlas probe to run his tests. As luck would have it, I also have such a probe. I reached out to Daniel and he was very helpful in explaining how he had run his test (thanks Daniel!).

Results

I ran tests for .net, .org and .no for about 2.5 days. Interval was set to 6 hours.

Median (50%) 85% percentile Samples
.net 11 ms 38 ms 4544
.org 14 ms 47 ms 4552
.no 27 ms 111 ms 4545

Tests

Conclusion

.no is operated by Norid, they write the following about their domain name service:

The name service is designed to be extremly robust. This is achieved by implementing it as a mixture of Unicast and Anycast-structures, which results in a large number of physical machines, which are geographically and networkwise dispered around the world. The service is delivered partly by external and independent suppliers and partly by Norid. 1

I’m a bit surprised at the performance of the .no TLD, actually outperforming a lot of the other global TLDs.2 My web server IP doesn’t change, unless I migrate to a different server, so I can set my DNS records to be long-lived and maybe get a small performance gain.

Test method

  1. https://atlas.ripe.net/measurements/form/
  2. Click +DNS
  3. Set Interval to 21600
  4. Check “Use the Probe’s Resolver”
  5. Set Query Type to “NS”
  6. Set Query Argument to “org.” (with dot!)
  7. Repeat step 2-5 for more TLDs
  8. Click Probe Selection Wizard
  9. Write “Worldwide”
  10. Click Worldwide
  11. Select 300 probes
  12. Click Add, Add, OK
  13. Choose start and stop time
  14. Click Create
  15. Go to https://atlas.ripe.net/measurements/?page=1#tab-mine and wait for data
  16. Downloads -> json to get the test data

Analyze

To analyze the json file I downloaded I used the following Python script:

import json, sys
import numpy as np

datafile = str(sys.argv[1])

with open(datafile) as json_file:
    data = json.load(json_file)

    rt = []

    for p in data:
        for r in p['resultset']:
            try:
                rt.append(r['result']['rt'])
            except KeyError:
                pass

    print('samples: ' + str(len(rt)))
    print('50 pctl: ' + str(round(np.percentile(rt, 50), 0)))
    print('85 pctl: ' + str(round(np.percentile(rt, 85), 0)))

Last commit 2021-02-10, with message: remove prism ref, minor css fix