Virtual Private Cloud (VPC) 内の各 Elastic Compute Service (ECS) インスタンスには、毎秒 5,000 クエリという DNS クエリの制限があります。単一のインスタンスからの DNS クエリ数がこのしきい値を超えると、インスタンスはレート制限の対象となります。これは、可用性に関するサービスレベルアグリーメント (SLA) が保証できなくなることを意味します。この問題を緩和するには、次の 2 つのアプローチを検討してください:
ECS インスタンスの数を増やすことで、DNS クエリリクエストをより多くの ECS インスタンスに分散できるため、各 ECS インスタンスの DNS クエリリクエストの数を減らすことができます。
キャッシュアクセラレーションのために ECS ホストで nscd(Name Service Cache Daemon)サービスを有効にします。
説明nscd サービスが有効になっている場合、DNS レコードの変更が有効になるまでに時間がかかります。
nscd とは
nscd は、passwd、group、hosts、services、netgroup などのネームサービス情報をキャッシュするシステムキャッシュサービスです。システムのキャッシュヒット率を向上させ、ネームサービスクエリの数とトラフィック量を削減することで、サービスの応答を高速化します。このガイドでは、ECS インスタンスからの DNS クエリ数を削減するために使用される hosts の設定に焦点を当てます。
nscd の一般的な Linux コマンド
コマンド | 説明 |
yum install -y nscd | nscd をインストールします。 |
systemctl start nscd | nscd を起動します。 |
systemctl stop nscd | nscd を停止します。 |
systemctl restart nscd | nscd を再起動します。 |
systemctl status nscd | nscd の動作ステータスをクエリします。 |
nscd -g | さまざまなパラメータの構成ステータスと、有効になった後のキャッシュヒット率の統計を出力します。 |
nscd -i | 指定されたキャッシュを無効にします。 passwd、group、hosts、services、netgroup などを指定できます。 例:nscd -i hosts。 |
cat /etc/nscd.conf | 現在の nscd 構成の詳細をクエリします。 |
vi /etc/nscd.conf | nscd 構成パラメータを変更します。 |
nscd のインストール
nscd は通常、Linux オペレーティングシステムにデフォルトでインストールされています。 現在の ECS インスタンスに nscd が既にインストールされているかどうか不明な場合は、次のコマンドを実行して確認できます。
systemctl status nscd # nscd の実行ステータスを確認します。検出結果が次のようになっている場合、nscd はインストールされていません。

インストールするには、次のコマンドを実行します。
yum install -y nscd
もう一度コマンドを実行して、nscd の実行状態を確認します。 nscd はインストールされていますが、実行されていません。

nscd サービスの有効化
nscd サービスを有効にするには、次のコマンドを入力します。
systemctl start nscdもう一度コマンドを実行して、nscd の実行状態を確認します。 nscd が実行されています。

CentOS または Red Hat オペレーティングシステムに nscd をインストールするには、コマンド yum install -y nscd を実行します。
Debian または Ubuntu オペレーティングシステムに nscd をインストールするには、コマンド apt-get install -y nscd を実行します。
Nscd 構成パラメータ
nscd のデフォルトの構成ファイルパスは /etc/nscd.conf です。 次のコマンドを実行することで、nscd 構成を表示できます。
cat /etc/nscd.conf
主要な構成パラメータの説明
構成パラメータ | 説明 |
debug-level | |
reload-count | アクティブなキャッシュリフレッシュに関連しています。 この構成パラメータは、成功したリクエストキャッシュがアクティブにキャッシュをクエリおよび更新する回数を決定します。 |
paranoia | パラノイアモード。 有効にすると、nscd は定期的に再起動します。 |
restart-interval | paranoia が有効になっている場合、このパラメータは再起動間隔時間を示します。 |
enable-cache | キャッシュサービスを有効にします。 |
positive-time-to-live | 成功したレスポンスキャッシュの有効期間。 |
negative-time-to-live | 失敗したレスポンスキャッシュの有効期間。 失敗したキャッシュがビジネスリクエストに影響を与えないように、0 に設定することをお勧めします。 |
check-files | /etc/passwd、/etc/group、/etc/hosts などのキャッシュファイルの変更時刻を定期的にチェックします。 最後のチェック以降にファイルが変更されている場合、キャッシュは無効になります。 |
persistent | 有効にすると、nscd は再起動後も以前のキャッシュの内容を保持します。 paranoia が有効になっている場合は、この機能を有効にすることをお勧めします。 |
shared | nscd データベースを提供するためのメモリマッピングは、クライアントと共有されます。 デフォルトは yes です。 |
max-db-size | nscd キャッシュデータベースの最大サイズ(バイト単位)。 |
positive-time-to-live は実際には意味がありません。 TTL 値は、DNS クエリリクエストによって返される TTL に基づいています。
nscd キャッシュの有効性のテスト
nscd を無効にした状態でのテスト
ECS インスタンスで次のコマンドを実行して、ポート 53 で UDP パケットをキャプチャします。
tcpdump -i any udp and port 53次に、nscd を無効にした状態で、ECS インスタンスで次のコマンドを複数回実行し、3 回連続でテストします。
ping -c 1 -n www.taobao.com # ドメイン名 www.taobao.com に ping コマンドを 1 回送信します。
対応するパケットキャプチャ結果を確認します。 ポート 53 で 3 つの DNS クエリリクエストが表示され、各 DNS クエリリクエストはドメイン名解決レコードを返します。 これは、DNS クエリレコードがキャッシュされておらず、ECS インスタンスが毎回ポート 53 を介して DNS クエリリクエストを送信する必要があることを証明しています。

nscd を有効にした状態でのテスト
start コマンドを実行して nscd サービスを有効にし、status query コマンドを使用して nscd が有効になっていることを確認します。
nscd を有効にした状態で、ECS インスタンスで次のコマンドを実行し、6 回連続でテストします。 同時に、ECS インスタンスのポート 53 でパケットをキャプチャします。
ping -c 1 -n www.taobao.com
対応するパケットキャプチャ結果を確認します。 ポート 53 でキャプチャされる DNS クエリリクエストは 1 つだけであることがわかります。これは、DNS クエリリクエストが nscd キャッシュにヒットし、ポート 53 を介して DNS クエリリクエストを送信しなかったことを証明しています。
重要パケットキャプチャ中に、ping コマンドが完了した後でも、tcpdump が関連ドメイン名の DNS クエリリクエストパケットを一定の間隔でキャプチャし続けることに気付く場合があります。 これは nscd のアクティブリフレッシュメカニズムによるものであり、正常な動作です。 reload-count パラメータを 0 に設定することで、アクティブリフレッシュメカニズムを無効にできます。
キャッシュヒット統計を確認することもできます。一定期間にわたって ping コマンドを複数回実行します。その後、次のコマンドを実行して統計を表示します:
nscd -g # すべてのアクティブなパラメーターの設定とキャッシュヒット率の統計を出力します。