집중적인 디스크, 네트워크 I/O 및 심지어 CPU 계산이 발생하는 내 C++ 프로그램에서는 메모리 매핑된 영역을 배열로 사용하고 있습니다.
아주 작은 데이터로도 잘 작동합니다. 그러나 매우 큰 데이터로 프로그램을 실행하면 내 응용 프로그램이 충돌합니다. (나는 OS가 모든 I/O와 버퍼링을 처리하기 때문에 mmap 영역의 크기가 문제가 되지 않는다는 것을 절대적으로 이해합니다.)
리눅스를 탓하고 싶지는 않지만 'mmap'이 불안정해져서 OS가 충돌할 수 있는 경우가 있는지 알고 싶습니다.
OS가 충돌하면 화면에서 일부 어쩌구 저쩌구 'write_back'과 관련된 커널 패닉 메시지를 볼 수 있습니다... (문제를 재현하자마자 여기에 메시지를 추가하겠습니다)
// 프로그램은 메모리 매핑된 영역(Infiniband의 RDMA가 활성화된 Intel MPI)에서 MPI 네트워크 작업을 사용합니다. 여기서 RDMA는 OS 커널을 우회하고 일부 데이터를 메모리에 직접 씁니다.
콜스택을 조사한 결과 몇 가지 커널 코드를 발견했습니다.http://lxr.free-electrons.com/source/fs/ext4/inode.c#L2313)
오류는 #L2386 BUG_ON(PageWriteback(page))의 'BUG_ON' 트랩에서 발생한 것 같습니다. 커널 버전은 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의 설명에 따르면 이는 커널 충돌(패닉)입니다. 반드시 그래야 한다절대일어나다.
이게 무슨 배포판인가요? 어떤 커널 버전인가요? 건축학?
먼저 모든 것을 업데이트하십시오. 배포판이 단종된 경우 업그레이드하십시오. 그런 다음 다시 시도해 보세요.
문제가 지속되면 mmap()
C++ 프로그램처럼 엄청난 양의 작업을 수행하는 작은 C 프로그램을 사용하여 이를 재현할 수 있게 만들고 해당 메모리에서 C++ 프로그램과 유사한 동작을 반복할 수 있어야 합니다(아마도 "멀리 액세스하려고 시도할 수도 있음"). "이면 충분합니다.) 모든 것을 수집하고 배포판의 버그 보고 채널을 통해 보고하십시오.