Skip to main content

[TIL] Lấy memory page size với CLI, Python, Rust, C

page size là gì?

$ apropos pagesize
getpagesize (2)      - get memory page size

$ man 2 getpagesize
       getpagesize - get memory page size

SYNOPSIS
       #include <unistd.h>

       int getpagesize(void);

..

DESCRIPTION
       The  function  getpagesize()  returns the number of bytes in a memory page,
       where "page" is a fixed-length block, the unit for  memory  allocation  and
       file mapping performed by mmap(2).

C function getpagesize trả về số bytes trong một memory page, trong đó page là một block có độ dài cố định, là đơn vị để cấp phát bộ nhớ (memory allocation).

Lấy page size bằng CLI, Python, Rust, C

CLI

$ whatis getconf
getconf (1)          - Query system configuration variables
getconf (1posix)     - get configuration values
$ getconf PAGESIZE
4096

Python

$ python3 -c 'import resource; print(resource.getpagesize())'
4096

Code C của lib resource:

#include <unistd.h>               // getpagesize()
...
static int
resource_getpagesize_impl(PyObject *module)
/*[clinic end generated code: output=9ba93eb0f3d6c3a9 input=546545e8c1f42085]*/
{
    long pagesize = 0;
#if defined(HAVE_GETPAGESIZE)
    pagesize = getpagesize();
#elif defined(HAVE_SYSCONF) && defined(_SC_PAGE_SIZE)
    pagesize = sysconf(_SC_PAGE_SIZE);
#else
#   error "unsupported platform: resource.getpagesize()"
#endif
    return pagesize;
}

https://github.com/python/cpython/blob/53aeb821d4d656ac224c17f48e20af9072a01414/Modules/resource.c#L331-L348

C

$ cat main.c
#include <unistd.h>
#include <stdio.h>

int main() {
    printf("Page size is %d bytes", getpagesize());
}
$ cc main.c && ./a.out
Page size is 4096 bytes

Rust

$ cargo new pagesize
    Creating binary (application) `pagesize` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
$ cd pagesize/
$ cargo add libc
...
# src/main.rs
fn getpagesize() -> usize {
    unsafe { libc::sysconf(libc::_SC_PAGE_SIZE) as usize }
}
fn main() {
    println!("Page size is {} bytes", getpagesize());
}

Cargo.toml

[package]
name = "pagesize"
version = "0.1.0"
edition = "2021"

[dependencies]
libc = "0.2.174"

Kết quả:

$ cargo run
   Compiling libc v0.2.174
   Compiling pagesize v0.1.0 (/home/me/pagesize)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.77s
     Running `target/debug/pagesize`
Page size is 4096 bytes

Kết luận

Hầu hết các Linux OS đều dùng page size 4096 bytes hay 4k, thì MacOS M1, M2, M4 lại có page size là 16384 == 16k. Sự khác biệt này dẫn tới nhiều vấn đề thú vị như k3s 16k kernel page builds to support Apple Silicon (ARM64), hay installation of rockylinux 8 not proceeding in MacBook Pro m1 silicon chip

4K pages made sense back when the Intel 386 came out. They are thoroughly obsolete, and the only reason they are the default on typical ARM64 distros is because 4K is the lowest common denominator supported everywhere and the Linux kernel's poor design does not allow deciding the page size at boot time. 16K is unarguably beneficial for all but the smallest embedded systems, and 64K is the logical choice for large servers. 4K pages increase overhead and do not provide a measurable memory savings. There's a reason Apple went with 16K for their entire 64-bit ARM ecosystem (because it's better, and because they control it all so they can make that decision).

Quote marcan

Bài viết thực hiện trên:

$ lsb_release -d; uname -rm
Description:    Ubuntu 22.04.5 LTS
6.8.0-64-generic x86_64

Hết.

HVN at https://pymi.vn and https://www.familug.org.

Ủng hộ tác giả 🍺

Comments

Popular posts from this blog

Tài liệu và hướng dẫn học Python

Để tiết kiệm thời gian, tốt nhất là đi học PyMI Updated: 130617 Sau đây là các tài liệu khuyên dùng: Vì nhiều lý do, nên học python2.7 tại thời điểm hiện tại (giờ là tháng 6/2013 - muốn biết tại sao thì tự tìm hiểu) python 3.5+ (giờ là tháng 2/2017) Chuẩn bị: 1. biết bật tắt máy 2. biết cài python 3. tập gõ 10 ngón - gõ 2 ngón hay 1 ngón cũng không sao, nhưng 10 ngón là cách dễ nhất để gõ nhanh nhất. Tài liệu - Nên dùng tài liệu tại trang chủ của Python làm chính, tham khảo thêm các tài liệu khác tại http://www.familug.org/2016/12/free-ebook.html Căn bản, mới học 1.1 Python PyMI.vn https://pymi.vn/tutorial/ 1.2. Python offical tutorial kết hợp làm bài tập trên HackerRank  (đề bài bằng tiếng Anh, nhưng Google translate 1 lúc cũng ra vì có nhiều ví dụ mẫu đi kèm). Học viên của Pymi.vn có rất nhiều học viên đã tự học với Learn Python the hard way nhưng chưa thấy ai thành công cả. Hai link dưới nên đọc sau khi đã nắm được những phần cơ bản của ngôn ngữ pytho...

The PyMiers

New FAMILUG