AmazonLinuxでDNSキャッシュを試してみた

アイキャッチ AWS EC2

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

AWSチームのすずきです。

AWSにより提供されるサービス、可用性を確保するためエンドポイントはFQDNで提供されており、 その利用時にはDNSによる名前解決を必要とします。

Amazon Linuxを始めとする、昨今主要なLinuxディストリビューションでは、 標準状態ではDNSによる名前解決の結果がキャッシュされず、都度DNSサーバへの問合せが行われます。

コネクションプールの採用が難しい環境で、RDS、ElastiCache(Redis、Memcached)などを利用する場合に、 名前解決に伴う負荷が高まる事が懸念されました。

その対策としてDNSのローカルキャッシュの有効性について評価した所、性能向上効果が確認できました。その結果について展開させて頂きます。

検証環境

RDS

  • Instance Class:db.t2.micro
  • Engine:MySQL (5.6.19a)
  • Availability Zone:ap-northeast-1a
  • EC2

  • インスタンスタイプ:t2.micro
  • OS:Amazon Linux AMI 2014.09.1 (HVM)
  • Availability Zone:ap-northeast-1a
  • nscd

    DNSのローカルキャッシュとしてnscd(ネームサービスキャッシュデーモン)を利用しました。

    インストール

    yumコマンドを利用、OS標準レポジトリよりインストールを行いました。

     
    $ sudo yum install nscd
    

    設定(nscd.conf )

    キャッシュに伴う副作用を抑制する為「paranoia」モードを有効とし、 60秒毎にnscdの定期的に再起動とキャッシュデータの消去を実施する設定としました。

    /etc/nscd.conf 差分

     
    $ diff -c  nscd.conf.org nscd.conf
    *** nscd.conf.org       2014-11-12 11:24:11.590574033 +0000
    --- nscd.conf   2014-11-12 11:22:44.292500147 +0000
    ***************
    *** 37,44 ****
      #     stat-user               somebody
            debug-level             0
      #     reload-count            5
    !       paranoia                no
    ! #     restart-interval        3600
      
            enable-cache            passwd          yes
            positive-time-to-live   passwd          600
    --- 37,44 ----
      #     stat-user               somebody
            debug-level             0
      #     reload-count            5
    !       paranoia                yes
    !       restart-interval        60
      
            enable-cache            passwd          yes
            positive-time-to-live   passwd          600
    

    検証手順

    nscdサービスの有効、無効状態で以下の確認を行いました。

  • mysqlコマンド1万回の実行所要時間
  • tcpdumpによる、DNSサーバ通信件数の取得
  • 結果と考察

    nscdサービス DNSサーバ通信数 RDS(mysql)所要時間
    nscd無効 20012回 70.636s
    nscd有効 10回 39.412s

    nscdによるDNSキャッシュを有効化した事で、DNSサーバ通信数は0.05%まで減少、 1万回のRDS(mysql)接続の所要時間も56%と、明確な効果が認められました。

    nscd有効化に伴う副作用について、NIS、LDAPを導入した環境では特に注意が必要ですが、 フェイルオーバ時の切替遅延については「paranoia」モードの採用により抑制する事が可能と考えます。

    また、RDS、DB用途以外だけでなく、監視などでAWSのAPIを大量に実行される様なケースでも、 DNSキャッシュ導入の効果が期待できる可能性があると思われます。

    参考資料

    検証利用スクリプト(sql-10000.sh)

     
    #!/bin/bash
    
    RDS_ENDPOINT="XXXXX.ap-northeast-1.rds.amazonaws.com"
    RDS_USER="YYYYY"
    RDS_PASS="ZZZZZ"
    RDS_DB="mydb"
    
    for i in {1..10000}
      do
       mysql -h ${RDS_ENDPOINT} -u ${RDS_USER} -p${RDS_PASS} ${RDS_DB} -e "select now()" > /dev/null
      done
    

    操作結果(nscd無効時)

     
    # nscd 停止
    $ sudo service nscd stop
    Stopping nscd:                                             [  OK  ]
    
    # tcpdump 実行(ポート53対象)
    $ sudo tcpdump -c 30000 dst port 53 -w nscd_off.dmp &
    
    # スクリプト実行(msql 1万回実行)
    $ time bash sql-10000.sh
    
    real    1m10.636s
    user    0m0.984s
    sys     0m0.820s
    
    # tcpdump停止
    $ sudo killall tcpdump
    
    # tcpdump 結果確認
    $  tcpdump -r nscd_off.dmp -q -n  | wc -l
    reading from file nscd_off.dmp, link-type EN10MB (Ethernet)
    20012
    
    $ tcpdump -r nscd_off.dmp -q -n  | head -n 6 
    reading from file nscd_off.dmp, link-type EN10MB (Ethernet)
    11:40:59.561433 IP 172.31.24.155.57740 > 172.31.0.2.domain: UDP, length 76
    11:40:59.561444 IP 172.31.24.155.57740 > 172.31.0.2.domain: UDP, length 76
    11:40:59.572847 IP 172.31.24.155.53883 > 172.31.0.2.domain: UDP, length 76
    11:40:59.572857 IP 172.31.24.155.53883 > 172.31.0.2.domain: UDP, length 76
    

    操作結果(nscd有効時)

     
    
    # nscd 開始
    $ sudo service nscd start
    Starting nscd:                                             [  OK  ]
    
    # tcpdump 実行(ポート53対象)
    $ sudo tcpdump -c 30000 dst port 53 -w nscd_on.dmp &
    
    # スクリプト実行(msql 1万回実行)
    $ time bash sql-10000.sh
    
    real    0m39.412s
    user    0m0.924s
    sys     0m0.844s
    
    
    # tcpdump停止
    $ sudo killall tcpdump
    
    # tcpdump 結果確認
    $ tcpdump -r nscd_on.dmp -q -n  | wc -l
    reading from file nscd_on.dmp, link-type EN10MB (Ethernet)
    10
    
    
    $ tcpdump -r nscd_on.dmp -q -n
    reading from file nscd_on.dmp, link-type EN10MB (Ethernet)
    11:50:06.641553 IP 172.31.24.155.60563 > 172.31.0.2.domain: UDP, length 76
    11:50:06.641564 IP 172.31.24.155.60563 > 172.31.0.2.domain: UDP, length 76
    11:50:14.236830 IP 172.31.24.155.50762 > 172.31.0.2.domain: UDP, length 76
    11:50:14.236839 IP 172.31.24.155.50762 > 172.31.0.2.domain: UDP, length 76
    11:50:29.243341 IP 172.31.24.155.39756 > 172.31.0.2.domain: UDP, length 76
    11:50:29.243351 IP 172.31.24.155.39756 > 172.31.0.2.domain: UDP, length 76
    11:50:37.238696 IP 172.31.24.155.53606 > 172.31.0.2.domain: UDP, length 44
    11:50:37.238707 IP 172.31.24.155.53606 > 172.31.0.2.domain: UDP, length 44
    11:50:44.250303 IP 172.31.24.155.36777 > 172.31.0.2.domain: UDP, length 76
    11:50:44.250315 IP 172.31.24.155.36777 > 172.31.0.2.domain: UDP, length 76