Константин Хлебников разработал (http://k001.livejournal.com/810982.html) полезную утилиту ioping (http://code.google.com/p/ioping/), позволяющую в стиле утилиты ping наблюдать за изменением отзывчивости системы ввода/вывода в Linux.Пример выполнения:
<font color="#461b7e">
$ ioping /home
4096 bytes from . (ext4 /dev/sda5): request=1 time=0.4 ms
4096 bytes from . (ext4 /dev/sda5): request=2 time=0.8 ms
4096 bytes from . (ext4 /dev/sda5): request=3 time=0.9 ms
4096 bytes from . (ext4 /dev/sda5): request=4 time=0.3 ms
4096 bytes from . (ext4 /dev/sda5): request=5 time=0.2 ms
--- . ioping statistics ---
5 requests completed in 4266.5 ms
min/avg/max/mdev = 0.2/0.5/0.9/0.1 ms</font>
URL: http://k001.livejournal.com/810982.html
Новость: http://www.opennet.me/opennews/art.shtml?num=30791
А вот я бы структурки-то обнулял при объявлении сразу, в местах типа
struct timeval tv = {0};
так, на всякий случай.
Зачем? Первая строчка после объявления структуры - передача её в gettimeofday.
Это когда сам всё пишешь и на 110% уверен, что там всё будет ОК, можно и так оставить. А когда юзаешь чужой код, дабы избежать трудноуловимых багов, порождённых иницилизацией структуры случайным мусором, лучше обнулять.
вот так и возникают тормозные программы с грязным кодом...
Как ?
> Как ?Спроси у авторов Excel 2010, который не может открыть более одного файла с одинаковыми именами.
Был однажды вопрос к Windows Server-департаменту ихнему, по поводу одной ерунды в их ОС, в официальном форуме техподдержки (остальные способы техподдержки все очень платные) посоветовали прикупить дополнительное third-party ПО, которое фиксит этот вопрос за over 9000. Так что спасибо, нет желания у них что-либо спрашивать, да и не юзаю я этот самый Excel 2010 :-)
Да самое оно для секретарш. И чем вас это парит?
> Да самое оно для секретарш. И чем вас это парит?Мне приходится его использовать. К счастью, дома я свободен в выборе софта.
Смущает время 0.2 ms./ioping /home -c 6 -i 1 -D
4096 bytes from /home (ext4 /dev/sdc2): request=1 time=14.7 ms
4096 bytes from /home (ext4 /dev/sdc2): request=2 time=6.0 ms
4096 bytes from /home (ext4 /dev/sdc2): request=3 time=0.2 ms
4096 bytes from /home (ext4 /dev/sdc2): request=4 time=0.2 ms
4096 bytes from /home (ext4 /dev/sdc2): request=5 time=2.5 ms
4096 bytes from /home (ext4 /dev/sdc2): request=6 time=3.5 ms--- /home ioping statistics ---
6 requests completed in 5028.8 ms
min/avg/max/mdev = 0.2/4.5/14.7/5.0 ms./ioping /dev/sdc2 -c 6 -i 1 -D
4096 bytes from /dev/sdc2 (block device): request=1 time=29.5 ms
4096 bytes from /dev/sdc2 (block device): request=2 time=13.3 ms
4096 bytes from /dev/sdc2 (block device): request=3 time=8.5 ms
4096 bytes from /dev/sdc2 (block device): request=4 time=7.8 ms
4096 bytes from /dev/sdc2 (block device): request=5 time=15.8 ms
4096 bytes from /dev/sdc2 (block device): request=6 time=18.2 ms--- /dev/sdc2 ioping statistics ---
6 requests completed in 5094.0 ms
min/avg/max/mdev = 7.8/15.5/29.5/7.3 ms
Это оптимизации на уровне файловой системы. Уже не раз замечал, что тестирование (dd) раздела raid10 медленнее, чем тестирование большого файла в файловой системе, лежащей на этом же разделе.
Всем пользователям Archlinux - милости прошу - https://aur.archlinux.org/packages.php?ID=49608
Спасибо за PKGBUILD!
Репозитории для OpenSUSE (11.3, 11.4, Factory, Tumbleweed) и SLE (11, 11 SP1): http://download.opensuse.org/repositories/home:/ZaWertun:/co.../
где ebuild, не в одном оверлеи нету
присоединяюсь к запросу. ебилды писать не умею (
> присоединяюсь к запросу. ебилды писать не умею (Однака, зачем мало-мало гента пингвин ставил, крутада ?
"Настоящие гентушники ебилдов не ждут, они их пишут" ( кто то и @g.org)
честно - некогда писать. и таки да, "Настоящие гентушники ебилдов не ждут, они их пишут" - враки. бывают еще и пользователи
Пользователь Gentoo, это даже смешнее, чем Windows сервер. :)
...сам пошутил, сам посмеялся.
> Пользователь Gentoo, это даже смешнее, чем Windows сервер. :)А если это Calculate?
>> Пользователь Gentoo, это даже смешнее, чем Windows сервер. :)
> А если это Calculate?То вот это уже смешно. На чем не пытайся делать макось, все равно винда получится, и соотв юзера винде юзера сбегутся.
Калька - это слишком много пиара при достаточно малом объеме дела.
> Пользователь Gentoo, это даже смешнее, чем Windows сервер. :)Как сказать. У меня жена является пользователем Gentoo. Точнее - Calculate с бинарным профилем. Полгода, полёт нормальный. Я только обновляю раз в неделю-две.
Значит трясите разрабов Calculate. А проще, ей-Богу, посмотреть представленный PKGBUILD для арча, взять какой-нить ebuild для примера и сделать. Это только кажется, что трудно.
> Значит трясите разрабов Calculate. А проще, ей-Богу, посмотреть представленный PKGBUILD
> для арча, взять какой-нить ebuild для примера и сделать. Это только
> кажется, что трудно.Не надо никого трясти, sys-process/ioping-0.4.ebuild с утра в оверлее Calculate.
> Пользователь Gentoo, это даже смешнее, чем Windows сервер. :)Однако, пытавшийся хоть раз написать что-то для генты, знает, какой это геморрой. Использовать их навязанные функции и прочую ерунду. Сидел на слаке, писал слакбилды регулярно. Гента во многом удобнее слаки, но вот писать ебилды - та еще др*чь.
ioping-0.4 в оверлее Calculate. Welcome.
./ioping /
4096 bytes from / (xfs /dev/root): request=1 time=0.0 ms
4096 bytes from / (xfs /dev/root): request=2 time=0.0 ms
4096 bytes from / (xfs /dev/root): request=3 time=0.0 msПля... :)
это нирвана
Интересно! Скачал поставил ;) min/avg/max понятно, а что такое mdev?
> min/avg/max понятно, а что такое mdev?time_avg = time_sum / request;
sqrt(time_sum2 / request - time_avg * time_avg);корень из разности квадратов ... х.з, наверно cреднеквадратическое отклонение.
diff -ur a/ioping.c b/ioping.c
--- a/ioping.c 2011-06-02 22:51:03.000000000 +0400
+++ b/ioping.c 2011-06-07 02:35:12.126000920 +0400
@@ -379,7 +379,7 @@
if (S_ISDIR(st.st_mode)) {
char *tmpl = "/ioping.XXXXXX";
- char *temp = malloc(strlen(path) + strlen(tmpl) + 1);
+ char *temp = calloc(1, PATH_MAX); // :)
if (!temp)
err(2, NULL);
@@ -498,7 +498,7 @@
usleep(interval);
}
-
+ free(buf); // end of posix_memalign()
time_total = now() - time_total;
time_sum += part_sum;
diff -ur a/ioping.c b/ioping.c
--- a/ioping.c 2011-06-02 22:51:03.000000000 +0400
+++ b/ioping.c 2011-06-07 04:01:04.000000000 +0400
@@ -166,6 +166,7 @@
char *path = NULL;
char *fstype = "";
char *device = "";
+short strduped = 0;
int fd;
char *buf;
@@ -258,41 +259,43 @@
void parse_device(dev_t dev)
{
- char *buf = NULL, *ptr;
- unsigned major, minor;
- struct stat st;
- size_t len;
FILE *file;
+ char *buf, *ptr;
+ unsigned major, minor;
+ size_t len = (~0);
/* since v2.6.26 */
file = fopen("/proc/self/mountinfo", "r");
- if (!file)
- goto old;
- while (getline(&buf, &len, file) > 0) {
+
+ if (file != NULL) {
+ buf = calloc(1, PATH_MAX);
+ while (getline(&buf, &len, file) > 0) {
sscanf(buf, "%*d %*d %u:%u", &major, &minor);
if (makedev(major, minor) != dev)
continue;
ptr = strstr(buf, " - ") + 3;
fstype = strdup(strsep(&ptr, " "));
- device = strdup(strsep(&ptr, " "));
- goto out;
- }
-old:
- /* for older versions */
- file = fopen("/proc/mounts", "r");
- if (!file)
+ device = strdup(strsep(&ptr, " "));
+ }
+ } else {
+ /* for older versions */
+ file = fopen("/proc/mounts", "r");
+ if (!file)
return;
- while (getline(&buf, &len, file) > 0) {
+
+ struct stat st;
+
+ while (getline(&buf, &len, file) > 0) {
ptr = buf;
strsep(&ptr, " ");
if (*buf != '/' || stat(buf, &st) || st.st_rdev != dev)
continue;
strsep(&ptr, " ");
fstype = strdup(strsep(&ptr, " "));
- device = strdup(buf);
- goto out;
+ device = strdup(buf);
+ }
}
-out:
+ strduped = 1;
free(buf);
fclose(file);
}
@@ -312,6 +315,12 @@
sigaction(signo, &sa, NULL);
}
+void free_on_exit(void) {
+
+ if (strduped)
+ free(fstype), free(device);
+}
+
int main (int argc, char **argv)
{
ssize_t ret_size;
@@ -323,6 +332,8 @@
double time_sum, time_sum2, time_mdev, time_avg;
double part_sum, part_sum2, part_mdev, part_avg;
+ atexit(free_on_exit);
+
parse_options(argc, argv);
if (wsize)
@@ -379,7 +390,7 @@
if (S_ISDIR(st.st_mode)) {
char *tmpl = "/ioping.XXXXXX";
- char *temp = malloc(strlen(path) + strlen(tmpl) + 1);
+ char *temp = calloc(1, PATH_MAX);
if (!temp)
err(2, NULL);
@@ -498,7 +509,7 @@
usleep(interval);
}
-
+ free(buf);
time_total = now() - time_total;
time_sum += part_sum;patch -p1 < copy-n-paste.diff;
# valgrind --leak-check=full --show-reachable=yes --track-origins=yes ./ioping -c5 .
==8328== Memcheck, a memory error detector
==8328== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==8328== Using Valgrind-3.6.1 and LibVEX; rerun with -h for copyright info
==8328== Command: ./ioping -c5 .
==8328==
4096 bytes from . (tmpfs tmpfs): request=1 time=1.7 ms
4096 bytes from . (tmpfs tmpfs): request=2 time=0.1 ms
4096 bytes from . (tmpfs tmpfs): request=3 time=0.1 ms
4096 bytes from . (tmpfs tmpfs): request=4 time=0.1 ms
4096 bytes from . (tmpfs tmpfs): request=5 time=0.1 ms--- . ioping statistics ---
5 requests completed in 4120.7 ms
min/avg/max/mdev = 0.1/0.4/1.7/0.7 ms
==8328==
==8328== HEAP SUMMARY:
==8328== in use at exit: 0 bytes in 0 blocks
==8328== total heap usage: 6 allocs, 6 frees, 12,868 bytes allocated
==8328==
==8328== All heap blocks were freed -- no leaks are possible
==8328==
==8328== For counts of detected and suppressed errors, rerun with: -v
==8328== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 4)Йес!!! Я спать! :)
Ты это лучше в апстрим отправь, тут то зачем публикуешь?
Он тут свое ЧСВ удовлетворяет, если еще не понятно. С освоил - нешуточное дело. Но бабы не ценят, а вот опеннет - совсем другое дело.
Судя по павлинуксу, кстати, бабы также не ценят Opteron и SSD. Приходится ему бедному время от времени на опеннете невзначай так про них упомянуть.
он кстати нормальный чувак, в отличие от.
и писать на Си может, когда другие только балаболят.
товарищи, объясните пожалуйста как эта утилитка работает?