как ядро ​​обрабатывает создание нового файла - PullRequest
1 голос
/ 05 августа 2010

Я хочу понять, как работает ядро, когда пользователь / приложение пытается создать файл в директории.

Справочная информация - у нас есть Java-приложение, которое принимает сообщения через JMS, обрабатывает его и затем пишетXML в исходящую очередь + локальный каталог.Вчера мы наблюдали необычные задержки при записи в каталог.В 'ls | wc -l' мы нашли> 300 000 файлов.Быстро обработал процесс и обнаружил, что он полон вызовов мьютекса (более 3/4 вызовов в потоке были мьютексами).

Поэтому я подумал, что создание нового файла занимает время, потому что система должнавремя проверять определенные вещи (например, имена файлов, чтобы убедиться, что можно создать новый файл с определенным именем) среди 300 000 файлов, а затем создать файл.

Я очистил каталог, и приложение возобновило нормальную работуУровни.

Мои вопросы

  1. Был ли мой анализ правильным (кажется, потому что приложение начало работать нормально после очистки)?
  2. Более импотрант, какработа ядра при попытке создать новый файл в каталоге.
  3. Можно ли отнести ненормальное количество вызовов мьютекса к большому количеству файлов в каталоге?

Большое спасибо J

Ответы [ 3 ]

3 голосов
/ 05 августа 2010

Пожалуйста, прочитайте о файловой системе Linux, i-узлах и d-узлах.

http://en.wikipedia.org/wiki/Inode_pointer_structure

Файловая система организована в блоки фиксированного размера. Если ваш каталог относительно небольшой, он помещается в прямые блоки и все быстро. Если ваш каталог не слишком большой, он помещается в прямые блоки и некоторые косвенные блоки и все еще достаточно быстр. Если ваш каталог становится слишком большим, он разбивается на двойные косвенные блоки и становится медленным.

Фактические размеры зависят от файловой системы и конфигурации ядра.

Практическое правило - хранить каталог под 12 блоками, в зависимости от размера вашего блока. Многие системы используют блоки 8K; быстрый каталог менее 98 304 байта.

Запись файла имеет размер около 16 * 4 байта (IIRC), поэтому в качестве практического верхнего предела следует планировать не более 1500 файлов на каталог.

1 голос
/ 05 августа 2010

Каталоги с большим количеством записей часто работают медленно - насколько медленно зависит от базовой файловой системы.

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

0 голосов
/ 06 августа 2010

Системные вызовы Mutex являются результатом того, что приложение (возможно, что-то в JVM или библиотеках Java) выполняет вызовы мьютекса.

Синхронизация внутри ядра вы не увидите через strace, так как это только анализирует системные вызовы.

Каталог с большим количеством файлов не должен стать неэффективным, если вы используете файловую систему, которая использует индексы каталога; большинство теперь делает (ext3 делает опционально, но в настоящее время он обычно включен).

Неиндексированные каталоги (например, используемые в старых старых файловых системах - ext2, vfat и т. Д.) Очень плохо работают с большим количеством файлов, и вы увидите, что системный вызов open занимает намного больше времени.

...