序章
「なんか最近ネットが重くないですか?」
という周囲の声。
色々と調べると使っているルーターの負荷が高そう。
ルーターの CPU 負荷に関しては SNMP 経由でデータを取得して Cacti あたりに飛ばせば追跡出来そう。実際に Cacti のデータテンプレートこさえて、グラフテンプレートこさえて CPU の負荷は追跡出きるようになったけど...。
そもそも何で負荷が高いのか?
色々と調べると NAT のテーブル数あたりが怪しいことが判明...ということで...今日も張り切って行ってみよう。
要件
- YAMAHA RTX1x00 の NAT テーブル数を確認する
- その確認したテーブル数を一定の間隔で追跡する
- CPU 負荷のグラフと合わせて検証して NAT テーブル数との因果関係について結論付ける
- 既に AWS の EC2 インスタンスに GrowthForecast は構築済み
構成イメージ
実装
YAMAHA RTX1x00 の NAT テーブル数を確認する
- 純粋に RTX1x00 に telnet やコンソールからログインしている場合には下記コマンドを実行
show nat descriptor address
- 以下のような結果が出力されるはず(冒頭部分且つ NAT テーブル数)
Masquerade Table
Outer address: ipcp/xxx.xxx.xxx.xxx port range=60000-64095 2564 used.
テーブル数を一定間隔で追跡する
- 今回は下記のような ruby のスクリプトを書いて cron で定期実行させる
require 'net/telnet' require "net/http" require "uri" # file = "/tmp/nat_table.txt" mode = "w" url = "http://growthforecast-url:5125/api/path" # telnet telnet = Net::Telnet.new("Host"=>"xxx.xxx.xxx.xxx") {|c| print c} telnet.waitfor(/Password[: ]*\z/n) {|c| print c} telnet.cmd("your password") telnet.cmd("console character ascii") results = telnet.cmd("show nat descriptor address") telnet.close result = results.grep(/used/) open(file,mode){|f|f.write(result)} # report open("/tmp/nat_table.txt") {|file| while l = file.gets str = l.split(nil) $table_num = str[5] end } uri = URI.parse(url) Net::HTTP.start(uri.host, uri.port){|http| header = { "user-agent" => "Ruby/#{RUBY_VERSION} LightHttpClient" } body = "number="+$table_num response = http.post(uri.path, body, header) }
結果
- こんな感じでグラフが生成される