집중적인 디스크, 네트워크 I/O, 심지어 CPU 계산이 발생하는 C++ 프로그램에서는 메모리 매핑된 영역을 배열로 사용합니다.
매우 작은 데이터의 경우 매우 잘 작동합니다. 그러나 많은 양의 데이터로 프로그램을 실행하면 응용 프로그램이 충돌합니다. (나는 OS가 모든 I/O와 버퍼링을 처리하기 때문에 mmap 영역의 크기가 문제가 되지 않는다는 것을 확실히 이해합니다.)
이것을 리눅스 탓으로 돌리고 싶지는 않지만, mmap이 불안정해지고 OS가 충돌할 수 있는 상황이 있는지 궁금합니다.
OS가 충돌하면 화면에서 다음과 같은 일부 "write_back"과 관련된 커널 패닉 메시지를 볼 수 있습니다... (문제를 재현한 후 여기에 메시지를 추가하겠습니다)
// 이 프로그램은 메모리 매핑된 영역(Infiniband의 RDMA가 활성화된 Intel MPI)에서 MPI 네트워크 작업을 사용합니다. 여기서 RDMA는 운영 체제 커널을 우회하고 일부 데이터를 메모리에 직접 쓸 수 있습니다.
호출 스택을 조사한 결과 일부 커널 코드를 발견했습니다.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
발생했습니다. 시스템 호출 인터페이스는 커널 데이터 구조를 손상시키기 위한 자금을 호출자에게 제공하지 않습니다.
나는 하드웨어 문제를 찾고 시스템 로그(예 /var/log/kernel.log
: . 실험적으로 디스크가 실패할 가능성이 가장 높은 구성 요소이기 때문에 동일한 크기의 파일을 다른 파일 시스템에 매핑해 보았습니다.
그것은가능한커널 버그가 발생했습니다. 빠른 검색다시 쓰기그리고공황[이 오래된 버그]가 나타났습니다.1 매우 오래된 커널을 실행하고 있다면 물론 업그레이드할 시기일 것입니다.
답변2
cooments의 설명에 따르면 그의 상황은 커널 패닉이었습니다. 반드시 해야 한다안 돼요발생하다.
이게 무슨 배포판인가요? 어떤 커널 버전인가요? 건축학?
먼저 모든 것을 업데이트하세요. 배포가 중단된 경우 업그레이드하세요. 그런 다음 다시 시도해 보세요.
문제가 지속되면 C++ 프로그램처럼 큰 작업을 수행하고 해당 메모리에서 C++와 같은 춤을 반복하는 작은 C 프로그램을 사용하여 이를 재현할 수 있어야 합니다 mmap()
(아마도 "Get into it"에 액세스하려고 시도했을 수도 있음). ) 모든 것을 수집하고 배포판의 버그 보고 채널을 통해 보고하십시오.