データ転送量に課金のないレンタルサーバーから、AWSやGCPなどデータ転送量によって課金がされるクラウドサービスに引っ越す時に、今使っているサーバーのデータ転送量は毎月どのくらいか知りたいことがあります。そこで今回は、Linux サーバーのデータ転送量を調べる方法と、データ転送量を自動でログに残しておく方法をまとめてみました。
データ転送量とは?
レンタルサーバーやクラウドサービスで言う「データ転送量」は、一般的にサーバーからインターネットへ向けての下りの通信量(アウトバウンド通信とも呼ばれます)を指し、この通信に課金されます。逆にインターネットからサーバーへの上りの通信(インバウンド)には課金されないことが多いです。
データ転送量を調べる方法
ifconfig コマンド
データ転送量は、ifconfig コマンドで表示される TX(送信)bytes の値で確認することができます。
RX(受信)の値と間違えないように注意しましょう。また、これらの値はサーバーを起動してから現在までのデータ転送量です。サーバーを再起動するとリセットされて「0」になります。
サーバーに複数の NIC(ネットワークインターフェースカード)が搭載されている場合は、インターネットとの通信に使われている NIC の値を見ることが必要です。下の例では、インターネットとの通信に使われている NIC eth0 のデータ転送量を表示しています。
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 160.16.57.86 netmask 255.255.254.0 broadcast 160.16.57.255
ether 9c:a3:ba:01:b4:d8 txqueuelen 1000 (Ethernet)
RX packets 28740231 bytes 2953730410 (2.7 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 17281863 bytes 18570720458 (17.2 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
/proc/net/dev
しかし CentOS7 など新しめのLinuxOSでは ifconfig コマンドが非推奨になっているためインストールされません。代替えとなる ip コマンドの addr オプションでは、データ転送量が表示されませんので、その場合は /proc/net/dev ファイルでデータ転送量を確認します。ifconfig コマンドもこの値を参照して表示しています。
Inter-face の列も含めて、10列目(18570725725)が Transmit bytes すなわちデータ転送量の値です。
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
eth0: 2953754198 28740592 0 0 0 0 0 0 18570725725 17281928 0 0 0 0 0 0
eth1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
eth2: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
lo: 145432890 1144286 0 0 0 0 0 0 145432890 1144286 0 0 0 0 0 0
データ転送量をログに残しておく方法
上の /proc/net/dev の Transmit bytes の値を切り出して、1日ごとにログファイルに出力しておきます。こうしておけば、前日とのデータ転送量の差を計算することによって、1日ごとのデータ転送量を把握することができますし、サーバーを再起動してしまいデータ転送量が「0」にリセットされても困りません。
Transmit bytes の値をログファイルに出力するスクリプトを作成します。
sudo vi /usr/local/bin/transmit_bytes.sh
# # /proc/net/dev の Transmit bytes 列をログに書き出すスクリプト # PATH="/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin" # インターネット通信に使われているNIC名を設定 NIC="eth0" # ログの出力先 LOG="/var/log/transmit_bytes.log" # 実行日時 AT=`date '+%Y-%m-%d %H:%M:%S'` # Transmit bytes の値を切り出し TX=`cat /proc/net/dev | grep $NIC | sed -e 's/:/ /' | awk '{print$10}'` # ログファイルへ出力 echo "${AT} ${TX}" >> $LOG exit 0
スクリプトに実行権限を設定します。
実行テスト
出力されている値が /proc/net/dev の Transmit bytes とほぼ一致していることを確認します。
スクリプトを定時に実行するように cron に登録すれば設定完了です。
sudo crontab -e
おわりに
データ転送量をログファイルに出力しておくほどでない場合は、uptime コマンドで現在までのサーバーの稼働時間を確認して、「Transmit bytes ÷ 稼働日数」でおおよその1日ごとのデータ転送量を計算することもできます。
コメント