Почему free и vmstat отображают разную информацию (общую и использованную)

trickle () {
    awk 'BEGIN { t = systime(); OFS="\t" }
               { print systime() - t, $0 }
               { t = systime()           }'
}

Эта небольшая функция оболочки просто оборачивает awkскрипт (, совместимый как с GNU awk, так и mawk -Wi, но не с BSD awkиз-за его отсутствияsystime()). Он будет выводить каждую строку ввода с префиксом количества полных секунд с момента последней строки вывода. Первая строка будет иметь префикс нуля.

Тестирование:

$ { echo hello; sleep 2; echo world } | trickle
0       hello
2       world

Сценарий awk, очевидно, может быть запущен и отдельно -:

$ some_command | awk 'BEGIN{OFS="\t";t=systime()}{print systime()-t,$0;t=systime()}

.

$ { echo hello; sleep 2; echo world; } | awk 'BEGIN{OFS="\t";t=systime()}{print systime()-t,$0;t=systime()}'
0       hello
2       world
1
07.11.2019, 12:27
1 ответ

"используемый" немного меняется, например, при выполнении разных команд. Разница в "всего" - ошибка.

freeи vmstatна самом деле имеют общий код. Оба они показывают переменную, которую procps вызывает kb_main_total. Но одна из команд -, не согласующаяся с /proc/meminfo -, использует тип с плавающей запятой. Обычное 32 -битное число с плавающей запятой имеет только 24-битную точность. vmstat.c:

static unsigned long unitConvert(unsigned long size)
{
    float cvSize;
    cvSize = (float)size / dataUnit * ((statMode == SLABSTAT) ? 1 : 1024);
    return ((unsigned long)cvSize);
}
$ python
...
>>> from ctypes import c_float
>>> c_float(131753676)
c_float(131753680.0)
1
27.01.2020, 23:40

Теги

Похожие вопросы