Persistent memory and page structures

Personal Computer/Linux 2015. 5. 26. 23:15 posted by tolkien

http://lwn.net/Articles/644079/


persistent memory(or non-volatile memory), 쉽게 NOR flash를 생각하면될 것같습니다. SSD에 대해서 direct-access를 하는 경우도 있을지도.

어쨌든 이 유형의 h/w는 cpu에서 직접 접근가능하다.라는 이점이 있어서 이것을 이용할 수 있는 방법에 대한 논의를 간단히 다룬 내용입니다.

단순하게 ROM처럼 page로 분할해서 mapping해버리면 1TB가 넘는 경우, 관리하는 데만많은 memory를 사용하므로 좋지 않습니다. 이에...
1. persistent memory에 대해서 Page Frame Number(PFN)을 사용.
 - http://lwn.net/Articles/643437/ - by Dan Williams
 - page structure를 손대서 persistent memory인 경우, page가 아닌 PFN을 사용
2. Directly mapped persistent memory page cache
 - http://lwn.net/Articles/644114/ - by Ingo Molnar
 - page structure를 일반 memory가 아닌 persistent memory에 저장

아직 어떤 방법도 code로 다 구현되어 있지 않고, 논의중입니다.

https://lwn.net/Articles/610174/

block device에서 data를 access하려면 data를 page cache에 올린 다음에 읽습니다. file system도 block device에 접근하기 위해서 page cache를 이용하지요. 그런데, 직접 접근가능한 block device(간단한 예로 RAM이나 NOR Flash)위에 file system을 올려서 사용한다면? page cache가 없는 편이 성능에 도움이 되는 상황도 있습니다.

이런 시도는 2005년 즈음에 ext2 file system에 XIP(excute in-place)를 구현하기도 했습니다. 위 기사는 DAX(directy access)라는 새로운 시도에 대한 얘기입니다.

ramfs와 같은 ram-based file system을 쓰는 것도 하나의 방법이긴 하지만, 전원이 나가면 사라지는 RAM이 아닌 Flash와 같은 NVM(non-volatile memory)위에서 NVM 전용 file system이 아닌 ext4와 같은 일반 file system에서 성능 향상을 시도하는 것으로 알고 있습니다. kernel 4.0부터 ext4에서는 지원된다고 합니다.

https://lwn.net/Articles/644906/

http://comments.gmane.org/gmane.linux.kernel.api/10603 - patch & discussion

http://permalink.gmane.org/gmane.linux.kernel.api/10636 - example(?)
http://coffeenix.net/doc/security/STACK_fingerprinting.txt
http://www.packetinside.com/2010/08/%ED%8C%A8%ED%82%B7%EC%A0%95%EB%B3%B4%EB%A1%9C-%EC%9B%90%EA%B2%A9%EC%A7%80-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%98-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EB%A5%BC-%EC%B6%94%EC%A0%95%ED%95%9C%EB%8B%A4-p0f.html

TCP 연결의 초기 packet에는 해당 IP를 운영하는 system의 정보를 많이 담고 있습니다. 문제는 그 정보는 kernel 내부에 있다는 점. 그 정보를 user-space에 있는 server들이 얻을 수 있도록 해주는 patch가 최근 merge되었다고 합니다.

setsockopt() 함수를 TCP_SAVE_SYN option과 같이 listen() 함수 이전에 호출한 다음, accept()로 얻은 socket에 대해서 getsockopt() 함수를 TCP_SAVED_SYN option으로 얻은 TCP/IP header를 통해서 정보를 얻을 수 있다고 합니다.

Delay-gradient congestion control

Personal Computer/Linux 2015. 5. 22. 00:21 posted by tolkien

https://lwn.net/Articles/645115/
http://www.spinics.net/lists/netdev/msg329391.html - patch
http://en.wikipedia.org/wiki/Network_congestion

network 혼잡제어 알고리즘(network congestion-control algorithm)중 하나로 CAIA delay gradient(CDG)라는 것이 제안되었답니다.

기존 알고리즘은 packet loss가 발생하기 시작하면 network이 혼잡한 것으로 인식하고, packet 전송 갯수를 줄이는데 비해 CDG는 round-trip time(RTT)를 이용합니다. 구체적으로는 RTT_min값이 증가하면 network의 혼잡도가 증가하는 것으로 인지한다고 합니다.

기존 알고리즘과 CDG와 공존과 같은 문제를 풀어야 적용될 것같습니다.
CDG에 대한 자세한 내용은 http://caia.swin.edu.au/cv/dahayes/content/networking2011-cdg-preprint.pdf 를 보시면 됩니다.

Memory protection keys

Personal Computer/Linux 2015. 5. 21. 10:42 posted by tolkien

http://lwn.net/Articles/643797/

https://lkml.org/lkml/2015/5/7/764 - patch set.


linux system call중에서 mprotect() 가 있다.

할당받은 memory에 대해서 read/write/execute를 제어한다. 이는 s/w로 구현되어 있다.

그런데, intel에서 차세대 64bit CPU에서는 MPK(Memory Protection Key)라는 기능을 제공하겠다고 한다. 

별도 register를 제공하는 형태가 될 듯. 이에 대해서 기존 system call 구현으로 충분한데, 굳이 h/w 구현까지 신경써야 하는 의견에 대해서 Alan Cox의 답변은 

"here is real-world demand for the ability to change protection on gigabytes of memory at a time, and that mprotect() is simply too slow."

CAP_SYS_RAWIO에 관한 논란

Personal Computer/Linux 2013. 3. 22. 13:42 posted by tolkien

http://lwn.net/Articles/542327/


kernel에 CAP_COMPROMISE_KERNEL capability를 이용해서

 MSR write을 제한하는 patch가 나오면서

 linux kernel의 capability에 대한 논란이 있었습니다.


linux kernel의 capability 문제는...
 1. 특정 기능 사용에 대한 제한에 관여하는 capability가 추가된다.
 2. 그에 따라서, capability를 사용하는 application이 수정되어야 한다.
     (예전에 작성한 code를 다시 손봐야한다!)
 3. 이전에 대한 호환성을 유지한다고 하면 security hole에 대한 수정사항은 어떻게 대처할 것인가?
 4. capability에 대한 전체적인 roadmap이 없다.
인 것으로 파악하고 있습니다.

linux kernel의 capability는
 CAP_SYS_RAWIO를 iopl(), ioperm()에 적용하는 것으로 시작했는데,
 자꾸 늘어나는데, 어떤 function()에 대해서 어떤 capability를 적용할 것인가,에 대한
 큰 그림이 없는 상태에서 하면서 정리하려고 하는 것같습니다.
 (root 권한과 CAP_SYS_ADMIN을 구분은 어떻게 해야 할 것인가?)

어쨌든, 이런 것은 자발적인 개발자에 의존하는 linux kernel 개발 모델의 약점이 아닐런지.

kernel 3.8 is out!

Personal Computer/Linux 2013. 3. 21. 11:17 posted by tolkien
linux에서 각 app별로 memory 사용량을 파악하는 것은 어렵습니다.
더욱이 현재 남아 있는 physical memory가 얼마인지 아는 것은 더욱 더 어렵죠.
Two approaches to kernel memory usage accounting
http://lwn.net/Articles/485593/

이번에 3.8에서 memory control group에 대해서 좀 더 나은 시도를 하고 있다고 합니다.
Improving kernel-memory accounting for memory cgroups
http://lwn.net/Articles/528078/

이번 시도는 TCP buffer에 대해서 먼저 시도를 해봤고,
그게 괜찮으니까 memory system 전체로 확장하려고 하고 있습니다.
Per-cgroup TCP buffer limits
http://lwn.net/Articles/470656/

잘 되면 이런저런 응용이 될 수 있을 것같습니다.
당장 응용을 하려는 곳은 OpenVZ라고 하는 container 방식의 virtualization입니다.
이른바 OS level의 가상화인데, 쉽게 말하면 한 pc에서 여러개 web server를 운영하는데,
각 web server를 마치 별도의 pc에서 실행되는 것처럼 제공하는 방식입니다.
virtualbox나 vmware는 machine level에서 가상화를 제공하지만,
OpenVZ는 OS level에서 제공하기 때문에 overhead가 적다고 합니다.

문제는 각 virtual machine에게 필요한 memory를 배타적으로 제공하는데,
이것을 memory control group을 통해서 제공하는데,
아직은 memory cgroup으로 여유있게 제공해야 한다고 합니다.
3.8에서 시도하는 것이 어느 정도 잘 되면 좀 더 알뜰하게 memory를 제공할 수 있겠죠.


What is vDSO?

Personal Computer/Linux 2009. 7. 28. 13:52 posted by tolkien
What is linux-gate.so.1? - by Johan Petersson

요즘 linux desktop에서 ldd를 때려보면 linux-gate.so.1이라는 파일이 보인다.
[tolkien@tolkien tmp]$ ldd /bin/ls
    linux-gate.so.1 =>  (0xb7f84000)
    librt.so.1 => /lib/tls/i686/cmov/librt.so.1 (0xb7f66000)
    libselinux.so.1 => /lib/libselinux.so.1 (0xb7f4d000)
    libacl.so.1 => /lib/libacl.so.1 (0xb7f45000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7df6000)
    libpthread.so.0 => /lib/tls/i686/cmov/libpthread.so.0 (0xb7dde000)
    /lib/ld-linux.so.2 (0xb7f85000)
    libdl.so.2 => /lib/tls/i686/cmov/libdl.so.2 (0xb7dda000)
    libattr.so.1 => /lib/libattr.so.1 (0xb7dd6000)
저건 vDSO(virtual Dynamic Shared Object)라는 것으로 최근 x86 cpu에서 보이는 sysenter 명령을 이용한다. 위 link에 자세히 설명이 되어 있는데, 간단히 설명하자면...
x86에서 system call을 들어가기 위해서 interrupt 0x80을 이용했는데, 이게 cpu가 빨라지면서 병목이 되어 버렸다는 거다. (보다 자세한 내용은 Re: What is VDSO?, 또는 Intel P6 vs P7 system call performance)
이에 대해 Intel에서 sysenter라는 명령어를 Pentium Pro부터 내놓았다. 하지만, 무척 많은 버그때문에 안 쓰이다가 Pentium III정도부터 쓰이기 시작. Linux는 2.6.12때부터, Windows는 XP부터 sysenter를 지원하기 시작한다.

기존 방식으로만 동작하는 cpu도 아직 있기에 linux는 둘 다 지원한다. linux kernel build하면 vdso-int80.so, vdso-systenter.so 두 file이 생기고, 둘 다 kernel image에 들어가서 booting시 syscall entry에 대해서 int 0x80을 쓸 것인지 sysenter를 쓸 것인지 동적으로 정한다고 한다.

systenter 명령어를 사용할 때, 문제가 되는 syscall이 있는데, 그것이 RESTART다. 그에 대해서 추가적으로 언급한 것이 Linus Torvalds is a disgusting pig and proud of it 이다.

kernel과 license

Personal Computer/Linux 2008. 4. 12. 11:08 posted by tolkien
ipTIME의 GPL 위반 - 류창우님의 글

동생이 PSP 샀다고 해서 ipTIME 무선 공유기를 샀었다. 예전에.
그때 가격도 무난하고 성능도 무난해서 좋았다.

그 제품은 내장 firmware로 linux kernel을 기반으로 만든 제품이었다고 한다. 그렇다면 문제는 GPL license에 따라서 사용자가 요구하면 source를 공개할 의무를 성실하게 이행하지 않고 있다는 것.
이에 ipTIME의 GPL 의무 위반 논의 그룹이 생겼다.
-----------------------------------------------------------------------------

회사에서 대기업 제품에 들어가는 kernel 작업을 했다.
중국에 출시된 제품이긴 한데, SCH-i519, SCH-i819, SGH-i858, SCH-i839. 이 네가지.
하지만, 관련 kernel이 떠도는 것을 본 적이 없다.
구매한 사람이 그런 것에는 관심이 없어서 그런건지는 모르겠지만,
kernel mailing에서 논의되는 것을 본 적도 없고, 그걸로 뭘 하려고 하는 것도 보지 못했다.

나와 내 동료가 만든 조금 부끄러운 code이긴 하지만, 나름대로 열심히 했었다. SCH-i519 출시때는 kernel 공개에 대해서 상당한 관심을 가지고 직접 공개하려 했지만, 이런저런 이유로 문제가 있다고 해서 포기하고, kernel source를 "갑"에게 전달하고, 이후 공개되기만 기다렸지만, 여지껏 그 kernel이 공개되었다는 소식은 듣지 못했다.

지금도 같은 회사에 다른 제품에 들어가는 kernel 작업을 하고 있다.
같은 팀의 다른 이는 지저분한 kernel이라서 보여주기 부끄럽다고 하지만, 내가 손댄 kernel이 많은 사람들에게 읽히리라고 생각하지 않는다. chip vendor사와 NDA를 맺고 kernel source와 DataSheet를 받았기에 우리가 공개할 수 있는 권한이 있는지도 모르겠다. 좌우간 이 프로젝트가 끝나면 역시 "갑"에게 kernel 및 몇몇 source가 공개되어야할 것들의 목록과 함께 source가 건너가겠지만... 그뿐 우리가 해야할 의무는 다 했다고 스스로 위로하면서 다음 프로젝트에 대한 준비를 할 것이다.

kernel guru들이 작업한 최신 kernel을 가지고...

LatencyTop

Personal Computer/Linux 2008. 2. 24. 19:03 posted by tolkien
커널 2.6.24에 포함된 LatencyTop - 모나씨님의 글

제품에 linux를 넣다보면 자주 괴롭히는 문제가 이른바 "tunning"이다.

BUT, 외부사람이 보기엔 system을 tunning하면 시스템이 좋아질 것이라는 환상을 품게 마련이다.
memory 부족하다면 "system memory 얼마나 줄일 수 있나요?"
단말 속도가 느리면 "NAND i/o 속도를 더 올릴 수 있나요?" "스케쥴러 tunning해야 하지 않나요?" 등등...
이럴때 H/W DataSheet 구해서 spec대비 얼마 효율인지 설명하면, 그 다음에는 spec에 최대한 근접하도록 압박을 받곤 한다. 그럼 그냥 묵묵히 tunning을 수행해야 한다. code review하고 test program 작성해서 측정하고 등등...

하고 나면 좋아지긴 하는데, 솔직히
내 개인적인 견해는 tunning 할 바에는 appl쪽 tunning하는게 가격대성능비가 좋다.이다.
tunning하기 위한 자료 측정도 쉬운 편이고 (필요하면 kernel에서 조금 지원해주면 된다), 또 tunning 결과도 꽤 괜찮다.

하지만, 오늘도 tunning을 해야 하는 내 입장에서 이런 tool이 나오는 것 환영.

해당 site
http://www.latencytop.org/

관련 기사
http://lwn.net/Articles/266153/
http://lwn.net/Articles/266246/
http://lwn.net/Articles/265945/