ИНФОРМАТИКА И ВЫЧИСЛИТЕЛЬНАЯ
ТЕХНИКА
УДК 004.724: 004.728
МОДЕРНИЗАЦИЯ ПРОЦЕССА ИЗМЕРЕНИЙ ИНТЕРВАЛОВ ВРЕМЕНИ В ОПЕРАЦИОННЫХ СИСТЕМАХ СОВРЕМЕННЫХ КОМПЬЮТЕРОВ
И.П. Иванов, А.Ю. Кондратьев, В.А. Лохтуров
МГТУ им. Н.Э. Баумана, Москва e-mail: [email protected]; [email protected]
Рассмотрена методика повышения точности измерений временных интервалов на примере утилиты ping, используемой при мониторинге локальных и глобальных компьютерных сетей.
Ключевые слова: компьютерная сеть, компьютерные технологии, утилита, модификация, операционная система, коммутатор, сервер.
MODERNIZATION OF PROCESS OF MEASURING TIME INTERVALS IN OPERATING SYSTEMS OF CONTEMPORARY COMPUTERS
I.P. Ivanov, A.Yu. Kondratiev, V.A. Lokhturov
Bauman Moscow State Technical University, Moscow e-mail: [email protected]; [email protected]
A technique for improvement of accuracy of time-interval measurements is considered by example of the ping utility used in monitoring of local and global computer networks.
Keywords: computer network, computer technologies, utility, modification, operating system, switchboard, server.
Отличительной чертой современного состояния развития компьютерных технологий является экспоненциальное повышение производительности самих компьютеров и пропускной способности сетей, их объединяющих. Тактовые частоты процессоров лежат гигагерцовом диапазоне, а скорости передачи информации по сегментам компьютерных сетей достигают десятков гигабит в секунду [1, 2]. Этот факт требует адекватной модернизации технологий проводимых измерений интервалов времени, осуществляемых при мониторинге оконечных и транзитных узлов компьютерных сетей и их сегментов.
Одной из самых популярных утилит оценки качества работы сети вот уже на протяжении более 30 лет является утилита ping, использующая для измерений времени функцию gettimeofday( ) [3], описание которой приводится на рис. 1.
# man gettimeofday
int settimeofday(const struct timeval *tv, const struct timezone *tz) ;
struct timeval {
time_t tv_sec; /* seconds */
suseconds_t tv_usec; /* microseconds */
};
Рис. 1. Описание функции gettimeofday()
Точность измерения времени этой функцией вычисляется в микросекундах, более того, в утилите ping время переводится в миллисекунды. В работе [4] отмечается недопустимость проведения измерений в компьютерных сетях в миллисекундном диапазоне уже для технологий Ethernet и Fast Ethernet, не говоря о пропускных способностях сетей Gigabit Ethernet и 10 Gigabit Ethernet. Там же предлагается модернизация утилиты ping, базирующаяся на измерении интервалов времени с точностью длительности одного интервала тактового генератора процессора, используемого для исследования компьютера. Измерения в тактах генератора конкретного процессора предполагают дальнейший пересчет в привычные единицы измерения, т.е. отсутствует свойство универсальности. Кроме того, эта модернизация утилиты возможна только для аппаратной платформы с архитектурой Intel на компьютере-измерителе и, наконец, модернизация не доведена до формы, привычной для самой утилиты ping, предполагающей статистическую обработку полученных при измерениях данных. В стандарте POSIX.1-2008 [5] функция gettimeofday( ) помечена как устаревшая и вместо нее рекомендуется использовать функцию clock_gettime( ), описанную стандартом POSIX.1-2001 [3]. На рис.2 приведено описание этой функции.
# man clock_gettime
int clock gettime(clockid t clk_id, struct timespec *tp);
/* seconds */ /* nanoseconds */
Рис.2. Описание функции clock_gettime()
Функцией clock_gettime( ) время измеряется в наносекундах, что соизмеримо с длительностью тактов в генераторах современных про-
struct timespec { time_t tv_sec; long tv_nsec;
} ;
цессоров и длительностью бит-тайма технологии Gigabit Ethernet современных сетей.
Целью настоящей работы является повышение точности измерений утилиты ping путем полной модификации ее исходного кода, с заменой функции gettimeofday( ) на clock_gettime().
Для модификации исходного кода утилиты ping была выбрана операционная система Linux в реализациях: Debian для платформы IBM PowerPC [6] и Ubuntu для платформы Intel [7]. В обеих реализациях ОС для управления программным обеспечением используются пакеты формата dpkg и менеджер управления пакетами APT (Advanced Packaging Tool). Для доступа к исходным кодам утилиты ping можно воспользоваться набором команд, представленным на рис. 3.
# apt-get^source'iputils-ping
Рис. 3. Набор команд доступа к исходным кодам утилиты ping
В данный пакет входят версии утилиты ping для протоколов IPv4 и IPv6. Для исключения из процесса сборки утилиты версии IPv6 и подключения библиотеки, реализующей функцию clock_gettime(), был модифицирован файл Makefile пакета (рис. 4).
TARGETS=$(IPV4_TARGE Т S) Рис. 4. Модификация файла Makefile
Исходными файлами утилиты ping из пакета iputils являются файлы pingcommon.h, pingcommon.c и ping.c.
Для вычисления временных параметров сети в оригинальной версии утилиты ping временной штамп, полученный функцией gettimeofday(), помещается в поле data пакета icmp. Поскольку размер структуры timeval, которой оперирует функция gettimeofday(), совпадает с размером структуры timespec, которой оперирует функция clock_gettime(), то можно регулярно проводить замены в исходном коде функции gettimejfday() на clock_gettime(), структур timeval на timespec и их элементов tv usec на tv nsec.
Для размещения в поле данных и вычисления статистических результатов в коде присутствуют операции приведения к общему знаменателю полей структуры timeval - tv sec и tv usec. Все эти приведения должны быть модифицированы с учетом замены структуры timeval на timespec и поля tv usec, хранящего время в миллисекундах, на поле tv nsec, хранящее время в наносекундах.
Результаты измерений в оригинальной утилите ping переводятся в миллисекунды, в модифицированной версии этот перевод устранен.
В процессе модификации исходных файлов утилиты ping использовалась система управления версиями RCS (Revision Control System). На рис. 5 представлена модификация файла pingcommon.h пакета iputils.
# rcsdiff -rl.l ping_common.h
RCS file: ping_common.h,v retrieving revision 1.1 diff -rl.l ping_common.h 96c96
< extern struct timeval start_time, cur_time;
> extern struct timespec start_time, cur_time; 131C131
< * Subtract 2 timeval structs: out = out - in. Out is assumed to
> * Subtract 2 timespec structs: out = out - in. Out is assumed to 134cl34
< static inline void tvsub(struct timeval *out, struct timeval *in)
> static inline void tvsub(struct timespec *out, struct timespec *in) 136cl36
< if ((out->tv_usec -= in->tv_usec) < 0) {
> if ((out->tv_nsec -= in->tv_nsec) < 0) { 138cl38
< out->tv_usec += 1000000;
> out->tv_nsec += 1000000000; 194cl94
< extern int parse_reply(struct msghdr *msg, int len, void *addr, struct timeval *);
> extern int parse_reply(struct msghdr *msg, int len, void *addr, struct timespec *);
206c206
< int csfailed, struct timeval *tv, char *from,
> int csfailed, struct timespec *tv, char *from. Рис. 5. Модификация файла ping common.h
Ниже приведен листинг модификации файла pingcommonx пакета iputils.
# rcsdiff-rl.l pingcommon.c
RCS file: ping_common.c,v retrieving revision 1.1 diff-rl.l ping common.c lcl
< #include "pingcommon.h"
> #include "ping common.h" 29c29
< struct timeval starttime, curtime;
> struct timespec start time, cur time; 262c262
< struct itimerval it;
> struct itimerspec it; 278c278
< it.itinterval.tvusec = 0;
> it.itinterval.tvnsec = 0; 280c280
< it.itvalue.tvusec = waittime%1000000;
> it.itvalue.tvnsec = waittime%1000000000; 300,301c300,302
< struct timeval tv;
< gettimeofday(&tv, NULL);
> struct timespec tv;
> // gettimeofday(&tv, NULL);
> clock_gettime( CLOCKREALTIME, &tv); 303c304
< (unsigned long)tv.tv_sec, (unsigned long)tv.tv_usec);
> (unsigned long)tv.tv_sec, (unsigned long)tv.tv_nsec); 312c313
< * of the data portion are used to hold a UNIX "timeval" struct in VAX
> * of the data portion are used to hold a UNIX "timespec" struct in VAX 327c328,329
< gettimeofday(&cur_time, NULL);
> // gettimeofday(&cur_time, NULL);
> clock_gettime( CLOCKREALTIME, &cur_time); 331c333
< struct timeval tv;
> struct timespec tv; 333c335,336
< gettimeofday(&tv, NULL);
> // gettimeofday(&tv, NULL);
> clock_gettime( CLOCKREALTIME, &tv); 335c338
< (tv.tvusec-curtime.tvusec)/1000;
> (tv.tvnsec-curtime.tvnsec)/1000000; 450c453
< struct timeval tv;
> struct timespec tv; 493c496
< tv.tvusec = 0;
> tv.tv nsec = 0; 496c499
< tv.tv usec = 1000 * SCHINT(interval);
> tv.tv nsec = 1000000 * SCHINT(interval); 503c506
< tv.tv usec = 1000*(SCHINT(interval)%1000);
> tv.tv_nsec = 1000000*(SCHINT(interval)% 1000000); 524c527,528
< gettimeofday(&start_time, NULL);
> // gettimeofday(&start_time, NULL);
> clock_gettime( CLOCK REALTIME, &start_time); 527c531
< struct itimerval it;
> struct itimerspec it; 530c534
< it.it interval.tv usec = 0;
> it.it interval.tv nsec = 0; 532c536
< it.it value.tv usec = 0;
> it.it value.tv nsec = 0; 623,624c627,628
< struct timeval *recv_timep = NULL;
< struct timeval recvtime;
> struct timespec *recv_timep = NULL;
> struct timespec recv_time; 657c661
< if (c->cmsg_len < CMSG_LEN(sizeof(struct timeval)))
> if (c->cmsg_len < CMSG_LEN(sizeof(struct timespec))) 659c663
< recvtimep = (struct timeval*)CMSG_DATA(c);
> recv timep = (struct timespec*)CMSG_DATA(c); 666c670,671
< gettimeofday(&recv_time, NULL);
> // gettimeofday(&recv_time, NULL);
> clock_gettime( CLOCK_REALTIME, &recv_time); 692c697
< int csfailed, struct timeval *tv, char *from,
> int csfailed, struct timespec *tv, char *from, 703,704c708,709
< if (timing && cc >= 8+sizeof(struct timeval)) {
< struct timeval tmp_tv;
> if (timing && cc >= 8+sizeof(struct timespec)) {
> struct timespec tmp tv; 709c714
< triptime = tv->tv_sec * 1000000 + tv->tv_usec;
> triptime = tv->tv_sec * 1000000000 + tv->tv_nsec; 714c719,720
< gettimeofday(tv, NULL);
> // gettimeofday(tv, NULL);
> clock_gettime( CLOCK REALTIME, tv);
773a780,781
> printf(" time=%ld ns", triptime);
> /*
784a793
> */
792,794c801,803
< cp = ((u_char*)ptr) + sizeof(struct timeval);
< dp = &outpack[8 + sizeof(struct timeval)];
< for (i = sizeof(struct timeval); i < datalen; ++i, ++cp, ++dp) {
> cp = ((u_char*)ptr) + sizeof(struct timespec);
> dp = &outpack[8 + sizeof(struct timespec)];
> for (i = sizeof(struct timespec); i < datalen; ++i, ++cp, ++dp) { 798,800c807,809
< cp = (u_char*)ptr + sizeof(struct timeval);
< for (i = sizeof(struct timeval); i < datalen; ++i, ++cp) {
< if ((i % 32) = sizeof(struct timeval))
> cp = (u_char*)ptr + sizeof(struct timespec);
> for (i = sizeof(struct timespec); i < datalen; ++i, ++cp) {
> if ((i % 32) = sizeof(struct timespec)) 832c841
< struct timeval tv = curtime;
> struct timespec tv = cur time; 852c861
< printf(", time %ldms", 1000*tv.tv_sec+tv.tv_usec/1000);
> printf(", time %ldms", 1000*tv.tv_sec+tv.tv_nsec/1000);
862c871
<
> /*
868a878,884
> */
> printf("rtt min/avg/max/mdev = %ld/%lu/%ld/%ld ns",
> (long)tmin,
> (unsigned long)(tsum),
> (long)tmax,
> (long)tmdev >);
877c893
< int ipg = (1000000*(long
long)tv.tv_sec+tv.tv_usec)/(ntransmitted-l);
> int ipg = (l000000000*(long long)tv.tv_sec+tv.tv_nsec)/(ntransmitted-l).
Далее представлен листинг модификации файла ping.c пакета iputils.
# rcsdiff-rl.l ping.c
RCS file: ping.c,v retrieving revision 1. 1 diff -r1.1 ping.c 2c2
< * Copyright (c) 1989 The Regents of the University of California.
> * Copyright (c) 1989 The Regents of the University of California. 499c499
< if (datalen >= sizeof(struct timeval)) /* can we time transfer */
> if (datalen >= sizeof(struct timespec)) /* can we time transfer */ 616c616
< * of the data portion are used to hold a UNIX "timeval" struct in VAX
> * of the data portion are used to hold a UNIX "timespec" struct in VAX 636,638c636,639
< static volatile int fakefuckedegcs = sizeof(struct timeval);
< struct timeval tmp_tv;
< gettimeofday(&tmp_tv, NULL);
> static volatile int fake fucked egcs = sizeof(struct timespec);
> struct timespec tmp_tv;
> // gettimeofday(&tmp_tv, NULL);
> clock_gettime( CLOCKREALTIME, &tmp_tv); 643c644
< memset(icp+1, 0, sizeof(struct timeval));
> memset(icp+1, 0, sizeof(struct timespec)); 653,655c654,657
< static volatile int fake fucked egcs = sizeof(struct timeval);
< struct timeval tmp_tv;
< gettimeofday(&tmp_tv, NULL);
> static volatile int fake fucked egcs = sizeof(struct timespec);
> struct timespec tmp tv;
> // gettimeofday(&tmp_tv, NULL);
> clock_gettime( CLOCKREALTIME, &tmp_tv); 690c692
< parse_reply(struct msghdr *msg, int cc, void *addr, struct timeval *tv)
> parse_reply(struct msghdr *msg, int cc, void *addr, struct timespec *tv) 796,798c798,801
< struct timeval recv_time;
< gettimeofday(&recv_time, NULL);
< printf("%lu.%06lu ", (unsigned long)recv_time.tv_sec, (unsigned long)recv_time.tv_usec);
> struct timespec recv_time;
> // gettimeofday(&recv_time, NULL);
> clock_gettime( CLOCKREALTIME, &recv_time);
> printf("%lu.%06lu ", (unsigned long)recv_time.tv_sec, (unsigned long)recv_time.tv_nsec);
Собранные для обеих платформ утилиты были названы nanoping и могут запускаться с ключами и спецификациями, идентичными таковым для утилиты ping.
Подключение систем Intel и PowerPC к корпоративной сети МГТУ им. Н.Э. Баумана осуществлялось с использованием коммутатора Cisco Catalyst, описание которого приведено ниже.
#show version
Cisco Internetwork Operating System Software
IOS (tm) C2950 Software (C2950-I6K2L2Q4-M), Version 12.1(22)EA13, RELEASE SOFTWARE (fc2)
Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2009 by cisco Systems, Inc. Compiled Fri 27-Feb-09 22:20 by amvarma Image text-base: 0x80010000, data-base: 0x80680000 ROM: Bootstrap program is C2950 boot loader
switch74_AIS uptime is 31 weeks, 3 days, 20 hours, 39 minutes
System returned to ROM by power-on
System restarted at 16:59:20 MSK Sun Aug 21 2011
System image file is "flash:/c2950-i6k212q4-mz.l21-22.EA13.bin"
cisco WS-C2950G-48-EI (RC32300) processor (revision P0) with 19912K bytes of memory.
Processor board ID FOC0834Y42N
Last reset from system-reset
Running Enhanced Image
48 FastEthernet/fEEE 802.3 interface(s)
2 Gigabit Ethernet/IEEE 802.3 interface(s)
32K bytes of flash-simulated non-volatile configuration memory.
Base ethernet MAC Address: 00:12:00:6E:AA:00
Motherboard assembly number: 73-7409-12
Power supply part number: 34-0965-01
Motherboard serial number: F0C08341RUF
Power supply serial number: DAB0833DAUL
Model revision number: P0
Motherboard revision number: A0
Model number: WS-C2950G-48-EI
System serial number: F0C0834Y42N
Configuration register is OxF
Проверка модифицированной утилиты nanoping для платформы IBM PowerPC выполнялась на сервере, конфигурация которого имеет следующий вид: # lshw p550-2
description: Computer product: IBM,9133-55A serial: IBM,030645B9H width: 32 bits *-core
description: Motherboard physical id: 0 clock: 1056MHz capabilities: ibm_9133-55a
*-firmware
product: IBM,SF240_320 physical id: 0
logical name: proc device-tree *-cpu:0
description: CPU product: P0WER5+ (gs) physical id: 2 bus info: cpu@0 version: 2.1 (pvr 003b 0201) size: 1900MHz clock: 1056MHz
capabilities: performance-monitor
*-cache
description: L1 Cache physical id: 0 size: 32KiB *-cpu:1
*-cpu:2
*-cpu:3
*-memory
description: System memory physical id: 6 size: 15GiB
Системное программное обеспечение сервера описано на рис. 6.
# uname -a
Linux p550-2 2.6.32-5-powerpc64 #1 SMP Tue Mar 8 02:01:42 UTC 2011 ppc64 GNU/Linux
# lsb_release -a
No LSB modules are available. Distributor ID: Debian
Description: Debian GNU/Linux 6.0.1 (squeeze) Release: 6.0.1 Codename: squeeze
Рис. 6. Системное программное обеспечение сервера IBM PowerPC
На рис. 7 представлены результаты обмена пакетами ICMP PING с сервером ya.ru размером 64 байта с интервалом 0,1 с в количестве 1000 штук для платформы IBM PowerPC.
powerpc# nanoping -i 0.1 -c 1000 ya.ru
PING ya.ru (93.158.134.3) 56(84) bytes of data.
64 bytes from ya.ru (93.158.134.3): icmp_req=1 ttl=57 time=2296031 ns
64 bytes from ya.ru (93.158.134.3): icmp_req=2 ttl=57 time=2496424 ns
64 bytes from ya.ru (93.158.134.3): icmp_req=999 ttl=57 time=2297043 ns 64 bytes from ya.ru (93.158.134.3): icmp_req=1000 ttl=57 time=3800034 ns ---ya.ru ping statistics---
1000 packets transmitted, 1000 received, 0% packet loss, time 100568ms rtt min/avg/max/mdev = 1293628/2116858/5042580/504256 ns
Рис. 7. Пример использования утилиты nanoping для сервера IBM PowerPC
Для сравнения на рис. 8 приведены результаты обмена пакетами ICMP PING с этим же сервером обычной утилитой ping с теми же опциями, что и nanoping. powerpc# ping -i 0.1 -c 1000 ya.ru PING ya.ru (93.158.134.3) 56(84) bytes of data. 64 bytes from ya.ru (93.158.134.3): icmp_req=1 ttl=57 time=2.63 ms 64 bytes from ya.ru (93.158.134.3): icmp_req=2 ttl=57 time=3.00 ms
64 bytes from ya.ru (93.158.134.3): icmp_req=999 ttl=57 time=2.53 ms 64 bytes from ya.ru (93.158.134.3): icmp_req=1000 ttl=57 time=2.04 ms ---ya.ru ping statistics---
1000 packets transmitted, 997 received, 0% packet loss, time 100490ms rtt min/avg/max/mdev = 1.283/2.351/5.041/0.686 ms
Рис. 8. Пример использования утилиты ping для сервера IBM PowerPC
Проверка модифицированной утилиты nanoping для платформы Intel осуществлялась на компьютере (PC), конфигурация которого имеет следующий вид: intell# lshw ms.bmstu.ru
description: Desktop Computer product: GEG vendor: KRAFTWAY serial: 10610023 width: 32 bits
capabilities: smbios-2.4 dmi-2.4 smp-1.4 smp
uuid=00000000-0000-0000-0000-001D7D0C062F *-core
description: Motherboard product: X48-DS4
vendor: Gigabyte Technology Co., Ltd. physical id: 0 version: x.x *-firmware description: BIOS
vendor: Award Software International, Inc.
physical id: 0
version: F2 (07/17/2008)
size: 128KB
capacity: 960KiB
capabilities: pci pnp apm upgrade shadowing cdboot bootselect edd intl3floppy360 intl3floppyl200 intl3floppy720 intl3floppy2880 int5printscreen int9keyboard intl4serial
intl7printer intlOvideo acpi usb lsl20boot zipboot biosbootspecification *-cpu:0
description: CPU
product: Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz
vendor: Intel Corp.
physical id: 4
bus info: cpu@0
version: 6.15.11
serial: 0000-06FB-0000-0000-0000-0000
slot: Socket 775
size: 1600MHz
capacity: 4GHz
width: 64 bits
clock: 266MHz
capabilities: boot fpu fpuexception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx x86-64 constanttsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor dscpl vmx est tm2 ssse3 cxl6 xtpr pdcm lahf_lm tpr_shadow vnmi flexpriority cpufreq
*-cache:0
description: L1 cache physical id: a slot: Internal Cache size: 64KiB capacity: 64KiB
capabilities: synchronous internal write-back *-cache:1
description: L2 cache physical id: b slot: External Cache size: 4MiB
capabilities: synchronous internal write-back
*-logicalcpu:0
description: Logical CPU
physical id: 3.1
width: 64 bits
capabilities: logical
*-logicalcpu: 1
*-logicalcpu:2
*-logicalcpu:3
*-memory
description: System Memory physical id: 19
slot: System board or motherboard size: 4GiB ...
Описание системного программного обеспечения этого компьютера приведено на рис. 9.
intell# uname -a
Linux ms.bmstu.ru 2.6.32-21-generic-pae #32-Ubuntu SMP Fri Apr 16 09:39:35 UTC
2010 i686 GNU/Linux
intell# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 10.04.3 LTS
Release: 10.04
Codename: lucid
Рис. 9. Системное ПО для PC платформы Intel
Результаты обмена пакетами ICMP PING с сервером ya.ru утилитой nanoping для PC платформы Intel представлена на рис. 10. intell# nanoping -i 0.1 -c 1000 ya.ru PING ya.ru (93.158.134.3) 56(84) bytes of data. 64 bytes from ya.ru (93.158.134.3): icmp_req=1 ttl=58 time=2310666 ns 64 bytes from ya.ru (93.158.134.3): icmp_req=2 ttl=58 time=2059204 ns
64 bytes from ya.ru (93.158.134.3): icmp_req=999 ttl=58 time=2298258 ns 64 bytes from ya.ru (93.158.134.3): icmp_req=1000 ttl=58 time=2179567 ns ---ya.ru ping statistics---
1000 packets transmitted, 1000 received, 0% packet loss, time 100546ms rtt min/avg/max/mdev = 1201137/2003100/4636744/481802 ns
Рис. 10. Пример использования утилиты nanoping для Intel PC
Для сравнения ниже приведены результаты обмена пакетами ICMP PING с этим же сервером обычной утилитой ping. В обоих случаях опции утилит выбирались идентичными таковым для платформы IBM PowerPC.
intell# ping -i 0.1 -c 1000 ya.ru PING ya.ru (93.158.134.3) 56(84) bytes of data. 64 bytes from ya.ru (93.158.134.3): icmp_seq=1 ttl=58 time=2.05 ms 64 bytes from ya.ru (93.158.134.3): icmp_seq=2 ttl=58 time=3.85 ms
64 bytes from ya.ru (93.158.134.3): icmp_seq=999 ttl=58 time=1.95 ms
64 bytes from ya.ru (93.158.134.3): icmp_seq=1000 ttl=58 time=2.96 ms ---ya.ru ping statistics---
1000 packets transmitted, 1000 received, 0% packet loss, time 100510ms rtt min/avg/max/mdev = 1.152/2.230/5.864/0.672 ms
Сравнение результатов измерений времени обмена ICMP пакетами для утилит nanoping и ping свидетельствует о полной работоспособности проведенных модернизаций исходных кодов файлов pingcommon.h, pingcommon.c и ping.c. Использование предлагаемой утилиты nanoping дает возможность повысить точность измерений интервалов времени RTT (Round Trip Time) минимум на 3 порядка, что весьма желательно при мониторинге современных локальных вычислительных сетей.
Применение функции clock_gettime() может быть рекомендовано и для модернизации других утилит в ОС современных компьютеров при замерах интервалов времени.
СПИСОК ЛИТЕРАТУРЫ
3. 1003.1-2001 — IEEE Standard for Information Technology — Portable Operating System Interface (POSIX(R)).
4. Иванов И. П. Математические модели коммутаторов локальных вычислительных сетей // Вестник МГТУ. Сер. Приборостроение. - 2009. - № 2. - С. 8492.
5. 1003.1-2008 — IEEE Standard for Information Technology — Portable Operating System Interface (POSIX(R)).
6. БойченкоМ. К., Иванов И. П., Кондратьев А. Ю. Доступность ресурсов транспортных подсистем корпоративных сетей // Вестник МГТУ. Сер.
7. Филимонов А. Ю. Построение мультисервисных сетей Ethernet. - СПб.: БХВ, 2007. - 592 с.
Статья поступила в редакцию 30.05.2012