После отсутствия проблем с ArangoDB3 в течение нескольких лет я внезапно столкнулся с ошибкой ввода-вывода AQL вида
[HTTP 500][ERR 1305] AQL: IO error: While open a file for random read: /ssd1/arangodb3/engine-rocksdb/22850496.sst: No file descriptors available (while finalizing)
Это при выполнении вставки формы
insert { id: "foo", junk: [ 1, 2, 3 ] } in bar
Это произошло после выполнения длительной операции по заполнению новой базы данных.
Глядя на syslog, я вижу следующее (временные метки и т. д. опущены для удобства чтения):
ERROR [fae2c] {rocksdb} RocksDB encountered a background error during a compaction operation: IO error: While open a file for random read: /ssd1/arangodb3/engine-rocksdb/22850496.sst: No file descriptors available; The database will be put in read-only mode, and subsequent write errors are likely. It is advised to shut down this instance, resolve the error offline and then restart it.
ERROR [be9ea] {rocksdb} rocksdb: [db/db_impl/db_impl_compaction_flush.cc:2922] Waiting after background compaction error: IO error: While open a file for random read: /ssd1/arangodb3/engine-rocksdb/22850496.sst: No file descriptors available, Accumulated background error counts: 1
WARNING [afa17] {engines} could not sync metadata for collection 'OpenAlex_20240502/works'
WARNING [a3d0c] {engines} background settings sync failed: IO error: While open a file for random read: /ssd1/arangodb3/engine-rocksdb/22850496.sst: No file descriptors available
WARNING [afa17] {engines} could not sync metadata for collection 'OpenAlex_20240502/publishers'
Первое сообщение выше, кажется, указывает на что-то, но я не уверен, на что.
Файл, о котором идет речь, /ssd1/arangodb3/engine-rocksdb/22850496.sst не существует, что может быть очевидным источником проблемы, но я не знаю, как ее исправить.
Перезапуск Arango DB и системы не устраняет проблему.
В файловой системе более чем достаточно места
/dev/nvme0n1p1 7.3T 4.6T 2.8T 63% /ssd1
так что это не проблема.
arangodb --version отчеты
Arango DB Version 0.18.2, build 3518b68, Go go1.21.5
arangosh --version отчеты
3.11.8
architecture: 64bit
arm: false
asan: false
assertions: false
avx: true
avx2: false
boost-version: 1.78.0
build-date: 2024-02-22 14:43:37
build-repository: refs/tags/v3.11.8 eb715d099fb
compiler: gcc [11.2.1 20220219]
coverage: false
cplusplus: 202002
curl-version: none
debug: false
endianness: little
failure-tests: false
fd-client-event-handler: poll
fd-setsize: 1024
full-version-string: ArangoDB 3.11.8 [linux] 64bit, using jemalloc, build refs/tags/v3.11.8 eb715d099fb, VPack 0.2.1, RocksDB 7.2.0, ICU 64.2, V8 7.9.317, OpenSSL 3.0.13 30 Jan 2024
icu-version: 64.2
ipo: true
iresearch-version: 1.3.0.0
jemalloc: true
libunwind: true
license: community
maintainer-mode: false
memory-profiler: true
ndebug: true
openssl-version-compile-time: OpenSSL 3.0.13 30 Jan 2024
openssl-version-run-time: OpenSSL 3.0.13 30 Jan 2024
optimization-flags: -mfxsr -mmmx -msse -msse2 -mcx16 -msahf -mpopcnt -msse3 -msse4.1 -msse4.2 -mssse3 -mpclmul -mavx -mxsave
pic: 2
pie: 2
platform: linux
reactor-type: epoll
replication2-enabled: false
rocksdb-version: 7.2.0
server-version: 3.11.8
sizeof int: 4
sizeof long: 8
sizeof void*: 8
sse42: true
tsan: false
unaligned-access: true
v8-version: 7.9.317
vpack-version: 0.2.1
zlib-version: 1.2.13
Я использую Ubuntu 23.10
Linux servername 6.5.0-28-generiC#29-Ubuntu SMP PREEMPT_DYNAMIC Thu Mar 28 23:46:48 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
Я попытался переустановить Arango DB, но это не помогло. Я перезапустил приложение с контрольной точки, и теперь оно немедленно и постоянно выходит из строя. Даже простая вставка, описанная выше, вызывает ту же ошибку.
Приложение, написанное на Python, является многопоточным, использует модули multiprocessing и имеет 64 потока/процесса, каждый из которых выполняет загрузку.
У меня есть идентичный код, работающий в другой системе, и он успешно работает до завершения, поэтому я озадачен тем, что здесь может пойти не так.
«Нет доступных дескрипторов файлов» — это важный момент. Существует общесистемное ограничение на количество дескрипторов файлов, которые можно открыть во всех программах, обычно 1024. Ограничение в вашей системе смотрите в выводе ulimit -a. Что-то открывает слишком много файлов/сокетов — это может быть Arango DB или что-то еще, и Arango DB — несчастная жертва.
@JohnKugelman: Хотя это тоже был мой первый опыт, но я не уверен, как это сохранится после перезапуска ArangoDB или перезагрузки системы. В остальном система относительно спокойна — это моя настольная рабочая станция, и на ней работает обычная смесь приложений — веб-браузер, текстовые редакторы и т. д. Недавно я обновил Arango с 3.10 до 3.11. Может в этом и загвоздка???
Убедитесь, что ulimit не опущен. Вы можете использовать lsof, чтобы увидеть, какие процессы и какие файловые дескрипторы открыты. Проверьте руководство по использованию, там масса флагов.
@JohnKugelman: ulimit установлено на 1024. Я уверен, что оно не было изменено, так как если бы оно было, это сделал бы я. Я предполагаю, что возможно, что мой код каким-то образом оставляет висящие дескрипторы, хотя это больше похоже на то, что он находится на стороне ArangoDB.
1024 действительно мало, фактически это абсолютный минимум, и вполне вероятно, что после длительной операции по заполнению новой базы данных вы достигнете этого предела. Обратите внимание, что также вполне вероятно, что перезагрузка не решит эту проблему, поскольку в зависимости от ранее записанных данных (в частности, файлов WAL) процедура восстановления должна открыть множество файлов. Вам следует просто увеличить лимит!
Это не мой минус, но Stack Overflow предназначен для вопросов по программированию. Возможно, вы захотите изучить наш родственный сайт Спросите Ubuntu , но, пожалуйста, прочитайте их справочные страницы, прежде чем спрашивать там (и, пожалуйста, удалите этот пост не по теме и просмотрите наш справочный центр, прежде чем публиковать здесь снова).
@tripleee Точка взята. Однако, в свою довольно вялую защиту, когда я разместил вопрос, я подумал, что это могла быть какая-то ошибка в моем приложении, возможно, связанная с многопоточностью Python. Лишь позже я понял, что это была не ошибка в моем программировании, а простой вопрос конфигурации. Я стою (и сижу) исправленным. Пятьдесят ударов плетью и влажный отрицательный голос в мою пользу.





Во-первых, отмечу, что мне удалось запустить приложение, удалив пару довольно больших, но неиспользуемых баз данных и перезапустив приложение с самого начала. Успех! Хотя, как я укажу ниже, это больше связано с глупой удачей, чем с интеллектом.
Как отметили комментаторы, я считаю, что виноваты ограничения файлового дескриптора, но, как пьяный под фонарным столбом, я искал свои ключи там, где свет был хорош, а не там, где я на самом деле уронил ключи.
Сегодня утром мне наконец пришло в голову внимательно просмотреть файл запуска ArangoDB в /lib/systemd/system/arangodb3.service, который показывает следующее:
# system limits
LimitNOFILE=131072
LimitNPROC=131072
TasksMax=131072
что вызвало что-то вроде Ах-ха! момент в моем тусклом маленьком мозгу.
Это побудило меня взглянуть на резервную копию, сохраненную до того, как я удалил внешние базы данных:
myobfuscatedhost:/ssd1/arangodb3/engine-rocksdb# ls -1 | grep sst | wc -l
130878
И вот, эти цифры довольно близки.
Благодаря использованию lsof оказывается, что действительно каждый файл в каталоге engine-rocksdb открыт.
Следовательно, повышение вышеуказанных пределов должно решить проблему.
Я говорю «должен», поскольку я еще не полностью проверил свою гипотезу, поскольку, как я упоминал в первом абзаце, я временно решил проблему, удалив лишний набор данных и оставив себе достаточно места для выполнения поставленной задачи.
Увеличу лимиты в /lib/systemd/system/arangodb3.service, скрестю пальцы и надеюсь на лучшее.
Спасибо всем, кому удалось вбить ответ в мою тупую голову.
Мне интересно узнать причину отрицательного голосования по этому вопросу. Если я каким-то образом нарушил протокол, буду признателен за объяснение. Я считаю, что этот вопрос уместен для этого форума, так как вижу и другие вопросы, связанные с ArangoDB. Если нет, то, пожалуйста, направьте меня к лучшему. Я просмотрел форум базы данных, но там написано, что он предназначен для администраторов, а не пользователей. Возможно, я ошибаюсь. Если да, то поправьте меня, и я перенесу вопрос туда. Если вы думаете, что это глупый вопрос, то, пожалуйста, скажите мне, почему, и я снова попытаюсь задать лучший вопрос.