В вопросе 1 внешняя фрагментация обычно приводит к накладным расходам примерно в 2 раза или около того, 1 плюс вы получаете внутреннюю фрагментацию из-за гранулярности распределения. Ничто из этого не подходит для объяснения ваших наблюдений.
Итак, я не думаю, что это нормальная стационарная фрагментация.
Самым очевидным предположением является то, что 1,5 МБ является отметкой максимальной воды; когда-то он действительно имел либо 1,5 МБ байтов записей, либо 1,5 МБ / 2 байта записей с ожидаемой фрагментацией.
Другое предположение состоит в том, что правило 50% терпит поражение от немарковского распределения. Представьте, что я называю файлы "tmp% d", поэтому tmp1, tmp2, ... tmp1000, tmp1001, ...
Проблема здесь в том, что rm tmp1
не освобождает место для tmp1001
. Это явно дикое предположение.
Q2: Не существует хорошего способа чтения необработанного каталога. AFAIK, вам нужно будет либо взломать ядро, либо использовать debugfs для изменения типа inode, прочитать его, затем изменить его обратно, либо использовать debugfs для чтения inode, получения номеров блоков, а затем чтения блоков. Функциональный подход к отладке, вероятно, более разумен.
Вы можете решить проблему с производительностью, убедившись, что индексация включена. Смотри tune2fs
.
1 Правило Кнута о пятидесяти процентах: в стационарном состоянии 50% операций - это выделения, 50% - освобождения, 50% свободных блоков объединяются, затем дыры составляют 50% распределений и 50% пространства впустую. (Ака, 100% накладных расходов.) Это считается "нормальным". У Маллока та же проблема.