Приложение C++ с mmap убивает ядро? (паника ядра с mmap)

Приложение C++ с mmap убивает ядро? (паника ядра с mmap)

В моей программе на C++, где происходят интенсивные дисковые, сетевые операции ввода-вывода и даже вычисления на процессоре, я использую отображенную в память область в качестве массива.

С очень маленькими данными все работает отлично. Однако когда я запускаю программу с очень большими данными, мое приложение вылетает. (Я полностью понимаю, что размер региона mmap не должен вызывать беспокойства, поскольку ОС будет заниматься всеми операциями ввода-вывода и буферизации)

Я не хочу винить в этом Linux, но мне бы хотелось узнать, бывают ли случаи, когда mmap становится нестабильным и может привести к сбою ОС?

Когда ОС дает сбой, на экране я вижу сообщение о панике ядра, связанное с какой-то ерундой «write_back»… (Я добавлю сообщение сюда, как только воспроизведу проблему)

// Программа использует сетевые операции MPI над отображенной областью памяти (Intel MPI с включенным RDMA Infiniband), где RDMA, возможно, обходит ядро ​​ОС и напрямую записывает некоторые данные в память.

Я исследовал стек вызовов и нашел некоторые коды ядра: (http://lxr.free-electrons.com/source/fs/ext4/inode.c#L2313)

Я предполагаю, что ошибки возникают из-за ловушки 'BUG_ON' в #L2386 BUG_ON(PageWriteback(page)); версия ядра — 3.19.0 (https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.19.tar.xz)

введите описание изображения здесь

решение1

Вы не можетепричинапаника ядра через неправильное использование любого системного вызова, mmapвключая. Интерфейс syscall не предоставляет вызывающему возможности повредить структуры данных ядра.

Я бы поискал проблему с оборудованием и обратил бы особое внимание на любые подсказки в системных журналах, например /var/log/kernel.log. В качестве эксперимента я бы попробовал сопоставить файл того же размера с другой файловой системой, поскольку диск — наиболее вероятный компонент, который может выйти из строя.

Еговозможныйвы обнаружили ошибку ядра. Быстрый поискобратная записьипаникаобнаруживается [этот старый баг].1 Если вы используете очень старое ядро, то, конечно, вероятно, пришло время обновиться.

решение2

По описанию в cooments, это крах ядра (паника). Это определенно должноникогдаслучаться.

Какой это дистрибутив? Какая версия ядра? Архитектура?

Сначала обновите все. Если ваш дистрибутив закончился, обновите. Затем попробуйте еще раз.

Если проблема сохраняется, вы должны быть в состоянии сделать ее воспроизводимой с помощью небольшой программы на C, которая делает то же самое, mmap()что и ваша программа на C++, и повторить с этой памятью танец, похожий на танец C++ (возможно, достаточно просто попытаться получить доступ "далеко вглубь"). Соберите все и сообщите об этом через канал сообщений об ошибках вашего дистрибутива.

Связанный контент