Reddit

Proposal To Set ARM64 Kernel Stack Size At Boot Time To Reduce Memory Consumption

부팅 때 ARM64 커널 스택 크기를 설정해 메모리 사용량 줄이는 제안

Google의 Mostafa Saleh가 ARM64 커널 스택 크기를 부팅 매개변수로 조정하는 패치 15개를 RFC로 제안했습니다. 기본 16KB 대신 12KB나 8KB를 선택하면 Android에서 커널 메모리 사용량을 줄일 수 있으며, 패치 제안은 최대 약 50MB 절감을 추산합니다.

AI 요약

Google의 Mostafa Saleh가 Linux 커널 메일링 리스트에 ARM64 커널 스택 크기를 부팅 시 설정하는 RFC 패치 15개를 올렸습니다. 커널을 다시 빌드하지 않고도 스택 크기를 바꾸도록 하는 제안입니다.

스택 크기 조정

현재 ARM64 커널은 4KB 페이지를 쓸 때 기본 스택 크기가 16KB입니다. 제안은 부팅 옵션 kernel_stack_pages=로 크기를 조정합니다. 8KB보다 큰 크기가 필요하지만 16KB까지는 필요하지 않은 경우를 위해 12KB 설정도 추가합니다.

패치 설명에 따르면 Android 일부 시스템에서는 스레드 대부분이 할당량을 다 쓰지 않는데도 기본 스택 크기 때문에 커널 메모리 약 100MB가 할당될 수 있습니다. 16KB를 12KB로 낮추면 약 25MB, 8KB로 낮추면 약 50MB를 절약할 수 있다는 추산입니다. 작업별로 스택 크기를 다르게 설정하는 방안도 후속 아이디어로 언급됐습니다.

적용 범위와 논의

현재 제안은 ARM64에 한정됩니다. 다음 주 Linux Plumbers Conference에서 추가 논의가 예정돼 있습니다.

Reddit 반응

  • @Shished — 실제로 RAM이 얼마나 확보되나요?
  • @mina86ng — 패치셋을 보면, 일부 시스템, 특히 Android에서 기본 커널 스택 크기 16KB와 4KB 페이지를 쓸 때 약 100MB의 메모리가 할당될 수 있다고 합니다. 대부분의 스레드는 할당량을 거의 다 쓰지 않습니다. 스택 크기를 16KB에서 12KB로 줄이면 약 25MB, 8KB로 줄이면 약 50MB를 절약합니다.
  • @MatchingTurret — 프로세스가 시스템 콜처럼 커널 모드에 들어갈 때 커널 스택을 씁니다. 빌드 시점에 시스템 콜별 최대 스택 요구량을 정적으로 계산할 수 있지 않을까요? 각 시스템 콜에 최대 스택 크기를 배정하고, 진입할 때 풀에서 해당 크기의 스택을 프로세스에 주는 방식입니다. getpid(2)에는 몇 바이트만 주고, VFS 계층이나 네트워크 스택을 거치는 read(2)에는 필요한 만큼, 최대 16KB를 주면 됩니다.
  • @viva1831 — 정말 재미있는 방식은 CPU 코어마다 커널 스택을 하나만 두는 겁니다. 시스템 콜이 아주 짧으면 태스크 전환 전에 끝내고, 오래 걸리면 커널 워커 스레드에 넘깁니다. 그러면 스레드마다 커널 스택을 둘 필요가 없어집니다. 마이크로커널에서는 더 단순하겠지만 Linux에서도 가능할 것 같습니다.
    • @MatchingTurret — 스레드는 시스템 콜을 실행하는 동안에만 커널 스택을 할당받습니다. 반환할 때 스택을 풀에 돌려주고, 다음 스레드가 필요할 때 할당받는 방식이라면 제 아이디어에서도 스레드별 커널 스택이 없어집니다.
  • @RegretFree7723 — 하지만 ARM64용으로 커널을 빌드했을 때만 해당하는 거죠.