Назад | Перейти на главную страницу

Как обнаружить очень длинные блокировки файлов в Linux?

У меня есть спор по поводу моего Linux-сервера. Один из множества процессов обращается к одному файлу и блокирует его в случайное время на значительный период (> 60 секунд), что, в свою очередь, приводит к сбою других вещей.

Есть ли способ обнаружить сколько файл был заблокирован и каким процессом?

Я думаю, что вы ищете файл /proc/locks. Он показывает текущие блокировки файлов в системе. Это не показывает как долго файл был заблокирован, но это показывает каким процессом. Возможно, вам удастся определить, когда блокировка зарегистрирована в этом файле, и измерить прошедшее время. Пример такой:

cat /proc/locks 
1: POSIX  ADVISORY  WRITE 2245 08:06:1182714 1073741824 1073741824
2: POSIX  ADVISORY  WRITE 2245 08:06:1182714 1073741826 1073742335
3: POSIX  ADVISORY  WRITE 3058 08:06:10752740 0 0
4: POSIX  ADVISORY  WRITE 3058 08:06:10752739 0 0
5: POSIX  ADVISORY  WRITE 2421 08:06:10752766 0 EOF
6: POSIX  ADVISORY  WRITE 2421 08:06:11142048 0 EOF
7: POSIX  ADVISORY  WRITE 2421 08:06:9964366 1073741824 1073742335
8: POSIX  ADVISORY  WRITE 2421 08:06:11142040 0 EOF

Где столбцы:

  • Первый: замок #.
  • Второй: тип блокировки (POSIX, если блокировка была создана с fcntl и FLOCK если создано с flock.
  • Третий: режим блокировки (КОНСУЛЬТАТИВНЫЙ или ОБЯЗАТЕЛЬНЫЙ)
  • Четвертый: Тип блокировки (ЗАПИСЬ или ЧТЕНИЕ), соответствующий общим или исключительным блокировкам.
  • Пятый: PID процесса с блокировкой.
  • Шестой: Три числа, разделенные : который идентифицировал заблокированный файл.
  • Седьмой: Начальный байт блокировки.
  • Восьмой: Конечный байт блокировки

Вы можете узнать, сколько лет файлу блокировки, просто взглянув на метку времени, когда он был создан. Точно так же, если вы "cat logfile.name", очень часто в качестве единственного содержимого будет идентификатор процесса, который его создал.