Получение размера блока через DF VS Dumpe2FS

Вы можете использовать jq для обработки json-файлов в shell.

Например, я сохранил ваш образец json-файла как raul.json, а затем запустил:

$ jq .message.temperature raul.json 
409.5
25.1
409.5
$ jq .message.humidity raul.json 
null
40
null

jq доступен в комплекте для большинства дистрибутивов linux.

Возможно, есть способ сделать это в самом jq, но самый простой способ, который я нашел, чтобы получить оба нужных значения в одной строке, это использовать xargs. Например:

$ jq 'select(.message.id == 1490) | .message.temperature, .message.humidity' raul.json | xargs
25.1 40

или, если вы хотите перебрать все экземпляры .message.id, мы можем добавить .message.id к выводу и использовать xargs -n 3, поскольку мы знаем, что будет три поля (id, температура, влажность):

jq '.message.id, .message.temperature, .message.humidity' raul.json | xargs -n 3
4095 409.5 null
1490 25.1 40
2039 409.5 null

Затем вы можете обработать этот вывод с помощью awk или чего-либо еще.


Наконец, и python, и perl имеют отличные библиотеки для разбора и манипулирования данными json. Как и некоторые другие языки, включая php и java.

1
18.08.2018, 11:25
2 ответа

... reports different sector size (aren't the terms sector and block interchangeable?)

«Блок» используется для обозначения самых разных вещей. Нужно смотреть в конкретном контексте.

dfрасширяет это, говоря, что «блоки 1K -» означают блоки по 1 килобайту, даже если файловая система (s )использует разные размеры блоков.

«Сектор» изначально означает размер блока, который использует диск. Но обратите внимание, что ваш fdiskсообщает о двух разных типах размера сектора: «физическом» и «логическом» :-). Так что здесь тоже нужно смотреть на контекст. [ *]

Каков размер блока файловой системы?

Поскольку первыми инструментами, которые вы упомянули, были dfи dumpe2fs, я предположил, что вы ищете размер блока файловой системы. В этом случае вам нужно значение, которое dumpe2fsотображается как «Размер блока».

dumpe2fs— специальный инструмент для ext2/3/4, но я думаю, что это самый надежный подход. Тем не менее, это означает, что если вы используете другую файловую систему, вам придется использовать другой инструмент и точно подтвердить, что он использует для «размера блока».

Могут быть некоторые исключения из нормального размера блока файловой системы. Очень недавний ext4 может поддерживать встроенное хранение данных в inode. То есть файлы меньше определенного размера могут храниться в индексном узле файла без выделения каких-либо блоков данных вообще. См. Как использовать новую функцию Ext4 Inline Data? (хранение данных непосредственно в иноде)

Альтернативный метод запроса :statvfs()

В качестве альтернативы вы можете запустить stat -f /, чтобы отобразить statvfs()информацию о вашей корневой файловой системе. Обсуждалось здесь:stat размеры файловой системы .

stat -fвывод включает два разных поля,«Основной размер блока» и «Размер блока» :-).

«Фундаментальный» размер блока — это степень детализации использования пространства, сообщаемая в -, это будет применяться к df. Вы можете надеяться, что это та же самая степень детализации, которая используется для выделения файлового пространства. По крайней мере, это справедливо для ваших ext2/3/4 и во многих других случаях.

statутверждает, что другой размер блока должен использоваться «для быстрой передачи». В ext2/3/4 эти два размера блоков всегда будут одинаковыми.

Если бы ext2 когда-либо реализовывал фрагменты, такие как UFS из BSD UNIX, эти два размера могли бы различаться. Это отражено в dumpe2fs, всегда показывающем значение «Размер фрагмента», равное «Размеру блока». См. Для чего можно использовать f _bsize? (Похож ли он на st _blksize?)

Как более общий инструмент, stat -fв некоторых случаях может ввести в заблуждение.

Он также не очень широко используется; это может увеличить риск. Не помогает то, что он сообщает о двух разных значениях, где исходные значения не имеют отношения к собственным файловым системам Linux. FWIW, пользователи этого сайта ненавидели мой вопрос с просьбой подтвердить его поведение (по ссылке выше ). Я обычно предполагаю, что это означает, что они рассердились, потому что никто -не знает, как ответить на вопрос.

stat -f— это функция GNU coreutils. (Не поддерживается statиз FreeBSD 7.2 ).

Имеет ли значение «размер блока для быстрой передачи»?

Это описание может относиться к файловым системам, реализующим фрагменты. Если они не реализуют «отложенное выделение», может быть более эффективным убедиться, что вы используете буфер записи размером в блок -при увеличении длины файла. Как всегда, если вы думаете о внесении изменений для повышения производительности, вы должны стремиться подтвердить улучшение с помощью измерений.

В файловых системах Linux размеры двух блоков будут одинаковыми. В этом случае,Я не знаю причин использовать именно это значение для оптимизации.

Чаще всего пользовательскому пространству не нужно слишком беспокоиться о размерах вызовов ввода-вывода «для быстрой передачи». Планировщик ввода-вывода может объединять смежные операции ввода-вывода для повышения эффективности. А несинхронизированный -ввод-вывод через кеш страницы получает огромные преимущества в производительности за счет кэширования записи -назад и автоматического чтения -вперед. Вы можете пройти долгий путь, просто используя размер кеша страницы или жесткое -кодирование 4 КБ :-).

В большинстве случаев кэш страницы устанавливает минимальный размер для физического ввода-вывода. Размер страницы в большинстве систем составляет 4 КБ, и обычно файловый ввод-вывод проходит через кеш страницы. (Опять же, небольшие файлы — это особый случай. Вернее, последняя страница файла — это частный случай, если размер файла не является точным кратным 4 КБ ).


[ *]. учитывая современные уровни абстракции, вы можете иногда увидеть поле, в котором указано «размер сектора», указанное как 512, на современном диске «расширенного формата», который использует физические сектора размером 4 КБ.

4
27.01.2020, 23:11

Немного покопавшись, оказалось, что правильный способ получить размер блока

root@ubuntu-xenial:/proc# blockdev --getbsz /dev/sda
4096

Конечно, это может отличаться от одного блочного устройства к другому.

В любом случае приведенное выше значение, похоже, согласуется с выводомdumpe2fs

0
27.01.2020, 23:11

Теги

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