exelens 22.07.2009 14:54
Есть вопрос! — Измерить скорость работы в сети
Появилась задача, узнать какова скорость работы по сети.Как грамотно это сделать? Возможно ли сделать это в консоли без ГУёв?
(Этот вопрос пришёл мне в почту.)
m0nhawk 22.07.2009 15:31 #
+ 1 -
Вряд ли есть именно для измерения скорости, можно посмотреть bmon и iftop. Но придётся что-то качать. Как вариант ещё wget.
Провайдеры нередко, скажем так, слегка кривят душой, отвечая на вопросы по поводу скорости. :)
У прошлого прова в договоре было указано "До мегабита". Когда я пришёл к ним с распечаткой статистики, где явно было видно, что скорость в основном колебалась от 512кбит до ~700кбит, мне показали договор и объяснили, что "до мегабита" - это значит "от нуля до мегабита" в зависимости от нагрузки на канал. Если хочу мегабит, то предложили сменить тарифный план на предусматривающий скорость "Один мегабит" с ценой в два раза выше. Сменил прова из принципа.
У следующего прова, к которому подключился, чётко сказано было "Два мегабита". Сначала всё так и было, а потом скорость ухудшилась и не поднималась выше полутора тысяч килобит. К ним я тоже пришёл с распечаткой, после чего приехали техники, посмотрели, проверили и выяснили, что в моём подъезде повреждён телефонный кабель(а инет через ADSL). Кабель заменили и всё стало прекрасно.
Как говорится, доверяй (провайдеру), но проверяй. :)
У следующего прова, к которому подключился, чётко сказано было "Два мегабита". Сначала всё так и было, а потом скорость ухудшилась и не поднималась выше полутора тысяч килобит. К ним я тоже пришёл с распечаткой, после чего приехали техники, посмотрели, проверили и выяснили, что в моём подъезде повреждён телефонный кабель(а инет через ADSL). Кабель заменили и всё стало прекрасно.
Как говорится, доверяй (провайдеру), но проверяй. :)
Если речь оскорости интернета, то http://www.speedtest.net/ =)
Если лан, то вгет.
Если лан, то вгет.
time wget url:/путь/к/эталонному_файлу
файл обычно от 500К до 1500К
утилита time - покажет время, потраченное на операцию. Дальше арифметика.
файл обычно от 500К до 1500К
утилита time - покажет время, потраченное на операцию. Дальше арифметика.
man ifstat
Утилита показывает текущую скорость передачи как входящих, так и исходящих потоков на любом интерфейсе. Запустив её, можно попробовать загрузить канал несколкими парралельными закачками чего-нибудь большого. Я обычно ставил несколько загрузок с kernel.org, и несколько с образами дисков каких-нибудь дистров. И скорость проверяю, и полезные вещи скачиваю. :)
Утилита показывает текущую скорость передачи как входящих, так и исходящих потоков на любом интерфейсе. Запустив её, можно попробовать загрузить канал несколкими парралельными закачками чего-нибудь большого. Я обычно ставил несколько загрузок с kernel.org, и несколько с образами дисков каких-нибудь дистров. И скорость проверяю, и полезные вещи скачиваю. :)
А что именно вы подразумеваете под скорость работы в сети ?
пропускную способность пакетов, объема, латентность ?
пропускную способность пакетов, объема, латентность ?
Хоть я и приверженец Console-free идеологии, все же раз уж попросили (да и такая задача легче решается как раз в консоли), то вот решение:
- Ставим утилиту iperf:
Для ArchLinux
yaourt -S iperf
pacman -S iperf
Для Ubuntu/Debian:
apt-get install iperf
aptitude install iperf
Для Mandriva:
urpmi install iperf
Для FreeBSD:
cd /usr/ports/benchmarks/iperf
make install clean
Для CentOS:
yum install iperf
Для Windows:
На официальной странице iperf для Windows можете найти прямую ссылку на утилиту iperf, которую желательно кинуть в папку, содержащуюся в переменной PATH (например, C:\WINDOWS) - Запускаем на одной машине в сети iperf в режиме сервера:
iperf -s -p 54321 -D
где -s говорит о том, что iperf запускаем в режиме сервера;
число после -p указывает на используемый для связи порт (по умолчанию используется порт 5001);
параметр -D говорит о том, что iperf запускается в режиме демона
В результате получим следующий вывод:
------------------------------------------------------------
Server listening on TCP port 54321
TCP window size: 65.3 KByte (default)
------------------------------------------------------------
при этом терминал будет занят iperf, если опция -D не была указана. В таком случае результаты тестов будут выводиться в терминал по мере их поступления и обработки:
iperf -s -p 54321
------------------------------------------------------------
Server listening on TCP port 54321
TCP window size: 8.00 KByte (default)
------------------------------------------------------------
<1840> local 172.16.0.5 port 54321 connected with 172.16.0.1 port 56059
< ID> Interval Transfer Bandwidth
<1840> 0.0-10.1 sec 4.31 MBytes 3.59 Mbits/sec
Если же сервер был запущен в режиме демона (опция -D), то процесс не будет занимать терминал, а только выдаст:
Running Iperf Server as a daemon
естественно, у вас ID будет другим и всегда разным
The Iperf daemon process ID : 5774 - Запускаем на другой машине в сети iperf в режиме клиента:
iperf -c server_ip -p 54321 -d
где -c указывает на то, что iperf запущен в режиме клиента;
число после -p устанавливает порт для связи (используем тот же порт, что и на сервере)
параметр -d заставит iperf провести "двустороннюю" проверку производительности - скорость до сервера и скорость до клиента (можно убрать этот параметр, так как вряд ли он нужен для обычных пользователей);
server_ip - IP адрес машины, на которой запущен iperf в режиме сервера. - В результате получим примерно вот такой вывод:
iperf -c 172.16.0.1 -d -p 54321
------------------------------------------------------------
Server listening on TCP port 54321
TCP window size: 8.00 KByte (default)
------------------------------------------------------------
------------------------------------------------------------
Client connecting to 172.16.0.1, TCP port 54321
TCP window size: 8.00 KByte (default)
------------------------------------------------------------
<1824> local 172.16.0.5 port 2455 connected with 172.16.0.1 port 54321
<1780> local 172.16.0.5 port 54321 connected with 172.16.0.1 port 60395
< ID> Interval Transfer Bandwidth
<1824> 0.0-10.1 sec 2.31 MBytes 1.93 Mbits/sec
<1780> 0.0-10.1 sec 2.02 MBytes 1.68 Mbits/sec
Это на стороне клиента в системе Windows при испольовании двустороннего теста.
Я подобное с исользованием netcat делал, но с подсчетом через iftop.
За iperf спасибо, засейвил себе. Меньше лишних действий.
За iperf спасибо, засейвил себе. Меньше лишних действий.
или так:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
typedef unsigned long long ull;
int parseDevFile(const char * iface, ull *bRx, ull *pRx,
ull *bTx, ull *pTx)
{
FILE * fp = NULL;
char * line = NULL;
unsigned int len = 0;
fp = fopen("/proc/net/dev", "r");
if(fp==NULL)
{
return -1;
}
while(getline(&line,&len,fp)!= -1)
{
if(strstr(line,iface)!=NULL)
{
// following line must be corrected for each distro, due the difference in /proc/net/dev!
sscanf(strstr(line,":")+1,"%llu%llu%*u%*u%*u%*u%*u%*u%llu%llu",
bRx, pRx, bTx, pTx);
}
}
fclose(fp);
free(line);
return 0;
}
void dumpInterfaceUsage(const char * iface)
{
ull ifaceBRxOld=0, ifaceBTxOld=0, ifacePRxOld=0, ifacePTxOld=0;
ull ifaceBRxNew=0, ifaceBTxNew=0, ifacePRxNew=0, ifacePTxNew=0;
const int SLEEP_TIME = 2;
if(parseDevFile(iface,&ifaceBRxOld,&ifacePRxOld,&ifaceBTxOld,&ifacePTxOld)==-1) return;
//sleep(SLEEP_TIME);
while(1)
{
if(parseDevFile(iface,&ifaceBRxNew,&ifacePRxNew,&ifaceBTxNew,&ifacePTxNew)==-1) return;
printf("%s In: %8.2f kbyte/s %5llu P/s Out: %8.2f kbyte/s %5llu P/s\n", iface,
(ifaceBRxNew-ifaceBRxOld)/(SLEEP_TIME * 1024.0),
(ifacePRxNew-ifacePRxOld)/SLEEP_TIME,
(ifaceBTxNew-ifaceBTxOld)/(SLEEP_TIME * 1024.0),
(ifacePTxNew-ifacePTxOld)/SLEEP_TIME);
ifaceBRxOld=ifaceBRxNew; ifaceBTxOld=ifaceBTxNew;
ifacePRxOld=ifacePRxNew; ifacePTxOld=ifacePTxNew;
sleep(SLEEP_TIME);
}
}
int main(int argc, char **argv)
{
if(argc != 2)
{
printf("Usage: %s interfacename\n", argv<0>);
exit(1);
}
dumpInterfaceUsage(argv<1>);
return 0;
}
некультурно выкладывать куски кода простым текстом при наличии тега code (тем более с подсветкой). И зачем было каждую вторую строку делать пустой?
пофиксил, но недоволен.
Ну, а для тех кому надо - компилится это дело так:
сохраняете все это в файлик с расширением .c (например, performance_test.c) и компилите командой:
gcc performance_test.c -o perf_test
После чего можете запускать утилиту:
или
После чего утилита будет непрерывно выводить в stdout по одной строке статистики:
Однако, это скорее монитор, чем действительно тестер "производительности" сети - он отобразит вам текущую скорость передачи в килобайтах и пакетах в нисходящем и восходящем потоках. Чтобы узнать пропускную способность нужно параллельно запустить передачу по сети какого-нибудь файла метров на 10-300 (в зависимости от ожидаемой пропускной способности сети). А потом, как уже писали, арифметика.
пофиксил, но недоволен.
Ну, а для тех кому надо - компилится это дело так:
сохраняете все это в файлик с расширением .c (например, performance_test.c) и компилите командой:
gcc performance_test.c -o perf_test
После чего можете запускать утилиту:
./perf_test eth0
или
./perf_test wlan0
После чего утилита будет непрерывно выводить в stdout по одной строке статистики:
wlan0 In: 0.00 kbyte/s 0 P/s Out: 0.00 kbyte/s 0 P/s
wlan0 In: 0.03 kbyte/s 0 P/s Out: 0.09 kbyte/s 0 P/s
wlan0 In: 0.03 kbyte/s 0 P/s Out: 0.09 kbyte/s 0 P/s
wlan0 In: 0.34 kbyte/s 4 P/s Out: 0.80 kbyte/s 4 P/s
wlan0 In: 0.03 kbyte/s 0 P/s Out: 0.09 kbyte/s 0 P/s
wlan0 In: 0.05 kbyte/s 1 P/s Out: 0.12 kbyte/s 1 P/s
wlan0 In: 0.03 kbyte/s 0 P/s Out: 0.09 kbyte/s 0 P/s
wlan0 In: 0.03 kbyte/s 0 P/s Out: 0.09 kbyte/s 0 P/s
...
Однако, это скорее монитор, чем действительно тестер "производительности" сети - он отобразит вам текущую скорость передачи в килобайтах и пакетах в нисходящем и восходящем потоках. Чтобы узнать пропускную способность нужно параллельно запустить передачу по сети какого-нибудь файла метров на 10-300 (в зависимости от ожидаемой пропускной способности сети). А потом, как уже писали, арифметика.
извини, первый комментарий здесь - кликал мышью быстрее чем думал, а функции редактирования комментариев не нашёл.
Функции редактирования комментариев недоступны пользователям. Для этого есть предпросмотр комментария, чтобы увидеть сразу как это будет выглядеть.