Linux のデータ転送量をログに残しておく方法

Linux
スポンサーリンク

データ転送量に課金のないレンタルサーバーから、AWSやGCPなどデータ転送量によって課金がされるクラウドサービスに引っ越す時に、今使っているサーバーのデータ転送量は毎月どのくらいか知りたいことがあります。そこで今回は、Linux サーバーのデータ転送量を調べる方法と、データ転送量を自動でログに残しておく方法をまとめてみました。

データ転送量とは?

レンタルサーバーやクラウドサービスで言う「データ転送量」は、一般的にサーバーからインターネットへ向けての下りの通信量(アウトバウンド通信とも呼ばれます)を指し、この通信に課金されます。逆にインターネットからサーバーへの上りの通信(インバウンド)には課金されないことが多いです。

データ転送量を調べる方法

ifconfig コマンド

データ転送量は、ifconfig コマンドで表示される TX(送信)bytes の値で確認することができます。
RX(受信)の値と間違えないように注意しましょう。また、これらの値はサーバーを起動してから現在までのデータ転送量です。サーバーを再起動するとリセットされて「0」になります。

サーバーに複数の NIC(ネットワークインターフェースカード)が搭載されている場合は、インターネットとの通信に使われている NIC の値を見ることが必要です。下の例では、インターネットとの通信に使われている NIC eth0 のデータ転送量を表示しています。

$ ifconfig 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 すなわちデータ転送量の値です。

$ cat /proc/net/dev
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

スクリプトに実行権限を設定します。

sudo chmod 755 /usr/local/bin/transmit_bytes.sh

実行テスト

sudo /usr/local/bin/transmit_bytes.sh

出力されている値が /proc/net/dev の Transmit bytes とほぼ一致していることを確認します。

tail /var/log/transmit_bytes.log

スクリプトを定時に実行するように cron に登録すれば設定完了です。
sudo crontab -e

00 00 * * * /usr/local/bin/transmit_bytes.sh

おわりに

データ転送量をログファイルに出力しておくほどでない場合は、uptime コマンドで現在までのサーバーの稼働時間を確認して、「Transmit bytes ÷ 稼働日数」でおおよその1日ごとのデータ転送量を計算することもできます。

コメント

タイトルとURLをコピーしました