пятница, 7 марта 2014 г.

Мониторинг (измерение) потребляемого траффика в Linux

Однажды мне потребовалось измерить количество трафика, которое «пожирает» некоторое приложение. Один из способов такого измерения — это установить прокси. Но что, если не хочется ставить прокси-сервер?.. Мне вот не хотелось. В поисках других способов я сначала перерыл Хабр, потом интернет. Так как я в своё время потратил на это много времени, то сейчас я создаю эту заметку, чтобы у других такой проблемы не возникло.

ВАЖНО:
Этот метод работает, если мы знаем по какому адресу (адресам) обращается наше приложение, или же с какого/каких портов.

Пошаговая инструкция


1. iptraf

iptraf — это небольшая программа, которая умеет мониторить всю сетевую активность компьютера.
Исходники и бинарники можно загрузить с сайта iptraf.

В случае Ubuntu установить iptraf можно выполнив команду:
sudo apt-get install iptraf

2. Запускаем!

В терминале пишем: iptraf


3. Настраиваем

Надо включить логирование (иначе программа ограничиться выводом на экран). Делается это, очевидно, в разделе «Configure».


4. Запуск мониторинга

Уходим из настроек, жмём «IP traffic monitor» и выбираем путь к файлу, куда будем логировать сетевую активность.


После этого мы должны увидеть такую картину:


Это всё, что нужно! Почти.

5. Анализ

Как я уже упоминал выше, нужно знать, по какому адресу/порту обращается наше приложение (трафик которого мы высчитываем).
Например, если мы хотим посчитать сколько трафика «стоит» час радио last.fm, мы должны определить следующее:
приложение last.fm обращается к адресам вроде таких:
195.24.* (last.fm не обращается к одному адресу, а обращается к диапазону адресов).
Чтобы вытащить из лога (который писался час) количество трафика, которое было съедено, я написал небольшую «программку» на java, которая этот трафик и считает:

package stat;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/**
 *
 * @author http://habrahabr.ru/users/nucleotide/
 */
public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new FileReader("/var/log/iptraf/ip_traffic"));
        String line;
        long count = 0;
        long traffic = 0;
        while ((line = reader.readLine()) != null) {
            count++;
            String s[] = line.split(" ");
            if (s.length < 12) {
                continue;
            }
            if (s[10].contains("195.24.") || s[12].contains("195.24."))  {   //"from" and "to"
                traffic += new Long(s[7]);
                     if(s.length>16) traffic += new Long(s[17]);
            }
        }
        System.out.println("Count: " + count + "  lines");
        System.out.println("Total: " + traffic + "  bytes!");
        System.out.println("Total: " + traffic / 1024 + "  Kbytes!");
        System.out.println("Total: " + traffic / (1024 * 1024) + "  Mbytes!");
    }
}



Этот вариант хорошо работает, когда вы постоянно пишите логи, а потом уже надо «что-то там» измерить. Просто нужно написать/сконфигурировать парсер именно так, как необходимо в конкретной ситуации, и тогда можно получить все необходимые данные.

Возможно, это не лучший вариант (хоть и работающий). Есть множество других вариантов:
http://help.ubuntu.ru/...
http://iptraf.seul.org/2.7/filters.html
И так далее.

Источник

Комментариев нет: