![Score_고동빈](https://meeco.kr/files/member_extra_info/profile_image/111/130/024/24130111.png?20200329202742)
미니 리눅스 커널 근황: 패치로 인한 성능 향상이 너무나도 뛰어나서 롤백
- Score_고동빈
- 조회 수 503
- 2019.09.17. 07:28
- 두 달 전에 커밋된 inode 관련 최적화 로 인해 리눅스 커널에서의 EXT4 읽기 속도가 비약적으로 향상
- 근데 해당 패치가 적용된 커널으로 아치 리눅스를 부팅하면 부팅 중 행(멈춤)이 걸리는 문제 발생, 이유를 살펴보니
- 특정 아치 리눅스 버전에서 getrandom() 호출을 하는 systemd 데몬을 부팅 중에 실행
- 근데 해당 패치를 적용한 커널의 경우에는 부팅 속도가 너무 빨라서 엔트로피 풀이 채워지기도 전에 부팅 완료
- 부팅 중의 getrandom()은 원래 /dev/urandom과 같이 non-block 콜이어야 하나, 특정 라이브러리(cryptsetup)와의 의존성 문제 때문에 block이 이루어짐
- 결국 이게 해결될 때 까지 해당 커밋 롤백(...)
부가 설명:
- getrandom()은 말 그대로 랜덤한 숫자를 제공해 주는 함수입니다.
근데 이 랜덤한 숫자라는 게, 사실 엔트로피 풀이라는 저장 공간 내에서 숫자를 하나 뽑아서 리턴 해 주는것이라 엔트로피 풀이 비어있으면 당연히 랜덤 넘버도 전달할 수 없습니다.
이 엔트로피 풀은 커널의 다양한 이벤트 발생으로 채워집니다 (https://stackoverflow.com/questions/19981189/how-does-the-kernel-entropy-pool-work 참고)
- non-block 콜이어야 한다는 건, getrandom() 함수를 실행하는 게 다른 프로그램의 실행에 영향이 없어야 한다는 뜻이나... 그게 정상적으로 작동하지 않음으로 인해 데드락이 발현됩니다.
- getrandom()이 결과값을 리턴하려면 커널의 엔트로피 풀이 채워져야 되는데, 엔트로피 풀이 채워지려면 getrandom()이 끝나고 다른 이벤트들이 발생해야 하고, 그러려면 엔트로피 풀이 채워져야 하고... 무한 반복이 되는거죠.
![Score_고동빈](https://meeco.kr/files/member_extra_info/profile_image/111/130/024/24130111.png?20200329202742)
신기하네요. 얼마나 빨라졌길래...