2017-10-18 6 views
3

libpmem을 사용하여 일부 소프트웨어를 개발하려고합니다. 필자는 pmem을 에뮬레이션 할 수있는 라이브러리를 라이브러리에 인식하도록 테스트 환경을 설정하고 있습니다. 나는 문제가 있거나, pmem이 mmap으로 어떻게 처리되는지에 대해 이해하지 못하고있다.에뮬레이트 된 pmem을 libpmem에서 pmem으로 인식하려고 시도했습니다.

난이 따랐다 : http://pmem.io/2016/02/22/pm-emulation.html

모든 것이 멋지다. 부트 로그는 내가 지정한 범위에서 유형 12 메모리를 보여줍니다./dev/pmemXX에 ext4 파일 시스템을 만든 다음 dax로 마운트했습니다. 그래서 지금 가지고 있습니다 :

$ mount | grep pmem 
/dev/pmem0m on /mnt/mem type ext4 (rw,relatime,dax,data=ordered) 

이제 문제가 생겼습니다. 파일 /mnt/mem/data/test1을 만듭니다. 다음으로 libpmem에서 간단한 복사 예제를 실행한다. 여기서 전화를 겁니다 :

addr = pmem_map_file("/mnt/mem/data/test2", ...) 

파일이 생성되고 데이터가 복사됩니다. pmem으로 등록하지 않습니다 pmem_map_file에 호출에 의해 반환

is_pmem = pmem_is_pmem(addr, file_size) 

주소 : 나는에서 결과를 얻을 때 문제가 온다. 코드를 단계별로 실행하면 매핑에 의해 반환 된 addr이 에뮬레이트 된 유형 12 메모리로 예약 한 메모리 범위에 없다는 것이 분명합니다. 또한 /mnt/mem/data/test2의 파일 경로는 라이브러리가 file stat를 사용할 때 dax 문자 장치로 등록하지 않으므로 매핑 된 주소와 파일 경로 테스트가 모두 pmem으로 인식되지 않습니다.

DAX에 대한 자료에서 DAX로 마운트 된 파일 시스템은 파일 메모리가 직접 매핑되어 실제 RAM에 복사되지 않는 것처럼 들립니다. 파일 매핑시 반환되는 addr에 대해 이것이 의미하는 바를 이해하려고합니다.

내가 여기에 뭔가 빠져있는 것처럼 느껴집니다. DAX로 마운트 된 에뮬레이트 된 pmem에 빌드 된 파일 시스템의 매핑 된 파일이 pmem인지 쿼리 할 때 true를 반환합니까?

*** 편집

정화에 대한

감사 표트르. PMEM_IS_PMEM_FORCE을 사용할 수 있지만 장치 dax 작업을보고 싶습니다. 네임 스페이스를 장치 dax로 재구성하려고하지만 성공하지 못했습니다.

$ sudo strace ./local/opt/bin/ndctl create-namespace -f -e namespace0.0 -m dax 
. . . 
open("/sys/devices/platform/e820_pmem/ndbus0/region0/pfn0.0/align", 
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/sys/devices/platform/e820_pmem/ndbus0/region0/pfn0.0/resource", 
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
open("/sys/devices/platform/e820_pmem/ndbus0/region0/pfn0.0/size", 
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
getdents(3, /* 0 entries */, 32768)  = 0 
close(3)        = 0 
open("/sys/devices/platform/e820_pmem/ndbus0/region0/dax_seed", 
O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory) 
write(2, "failed to reconfigure namespace:"..., 66failed to reconfigure 
namespace: Resource temporarily unavailable 
) = 66 
exit_group(245)       = ? 
+++ exited with 245 +++ 

아마도 내가 실행중인 커널에 문제가 있습니까? (4.4.0-97 우분투)

+0

[tag : dax] 태그는 다른 것을 의미한다고 생각합니다. 자신의 종류의 dax에 대한 태그가 있는지 확실하지 않습니다. – mendosi

+0

죄송합니다. 고쳤다. – Megan

답변

1

라이브러리가 예상대로 작동합니다. 지속적인 메모리 가능 리눅스 커널의 상태에 관한 man 3 libpmem의 현재의 노트 (글을 쓰는 시점에서 1.3) 버전을 참조하십시오

참고 : Linux에서 pmem_is_pmem는()가 true를 돌려주는 경우에만 전체 범위 중간 파일 시스템없이 장치 DAX (/dev/daxX.Y)에서 직접 매핑됩니다. 앞으로 pmem_persist()로 플러시를 지원하는 파일 시스템이 이 될 때 pmem_is_pmem() 은 적절하게 true를 반환합니다.

경고 : pmem_is_pmem()이 false를 반환하는 범위에서 pmem_persist()를 사용하면 유용하지 않을 수 있습니다. msync (2)를 대신 사용하십시오.

이것은 곧 바뀔 예정입니다. synchronous page faults patches을 참조하십시오.

  • 는,이 true를 반환하는 기능을 강제로 예정되어있는 PMEM_IS_PMEM_FORCE=1 환경 변수를 사용 : pmem_is_pmem()이 true를 반환 할 경우 한편

    , 당신은 두 가지 옵션이 있습니다.
  • 에뮬레이트 된 pmem 장치를 장치 dax로 재구성하십시오. 이 작업을 수행하려면 ndctl이 필요합니다. 명령은 다음과 같습니다. ndctl create-namespace -f -e namespaceX.Y -m dax 여기서 X는 지역 ID이고 Y는 지역 내의 네임 스페이스 ID입니다 (대부분 에뮬레이트 된 장치를 하나만 구성한 경우 namespace0.0 일 가능성이 큽니다).

장치 DAX는 하나의 익스텐트를 할당, 라이브 조각 모음처럼이 수 있습니다 배경/비동기 작업을 mmap 안전하게 모든 현재 리눅스 파일 시스템의 경우 반면에, 사용자 공간 세척을 수행 할 수있는 특수 문자 장치입니다 등등 - 이것은 일반 fs에서 dax로 마운트 했음에도 불구하고 여전히 데이터의 일관성을 보장하기 위해 msync()을 호출해야 함을 의미합니다. 그리고 그게 pmem_is_pmem()에서 알려줍니다.

문제에 대한 자세한 내용은 here을 참조하십시오.

+0

해명 해 주셔서 감사합니다. 장치 dax가 dax 옵션으로 마운트 된 파일 시스템과 비교하여 어떻게 작동하는지에 대해서는 명확하지 않았습니다. 내가 제안한대로 네임 스페이스를 ndctl로 재구성하려고 시도했다. 어떤 이유로 든 "자원을 일시적으로 사용할 수 없음"이라는 오류 메시지가 나타납니다. 수동으로 네임 스페이스를 사용하지 않으려 고 시도했지만 삭제하려고 시도했지만 지금까지 성공적으로 다시 구성 할 수 없었습니다. – Megan

+0

DAX에 대한 추가 정보를 게시물에 추가했습니다. 자세한 내용에 관심이 있으면 링크 된 LWN 기사를 읽는 것이 좋습니다. 귀하의 문제에 관해서, 나는 귀하의 문제를 결코 두려워하지 않습니다. 어떤 커널/ndctl 버전을 사용하고 있습니까? 최신 커널 (작성 당시 4.13)과 최신 ndctl (v58.2)을 사용하는 것이 좋습니다. –