以下為處理單個 HTTP GET request 時發出的系統呼叫:
以 Intel Pin 動態觀察系統呼叫的使用:
syscall #: 232
syscall #: 288
syscall #: 45
syscall #: 4
syscall #: 257
syscall #: 5
syscall #: 20
syscall #: 40
syscall #: 3
syscall #: 233
syscall #: 54
syscall #: 232
syscall #: 45
syscall #: 3
對應系統呼叫名稱為:
epoll_wait
accept4
recvfrom
stat
openat
fstat
writev
sendfile
close
epoll_ctl
setsockopt
epoll_wait
recvfrom
close
以 Intel Pin 動態觀察同樣行為的 call trace: (Gist 連結)
單個 HTTP request 的 call trace 約為 1.1k 行左右…,上述大部份系統呼叫都可以在 call trace 中找到,找不到的可能是用其他 symbol name 包裝了,例如:fstat
, stat
在 glibc 中分別以 __fxstat64
以及 __xstat64
包裝。
以 strace 動態觀察同樣行為:
epoll_wait(7, [{EPOLLIN, {u32=1479659536, u64=140236456841232}}], 512, -1) = 1
accept4(5, {sa_family=AF_INET, sin_port=htons(53944), sin_addr=inet_addr("118.166.75.229")}, [112->16], SOCK_NONBLOCK) = 9
recvfrom(9, "GET / HTTP/1.1\r\nHost: localhost:"..., 1024, 0, NULL, NULL) = 40
stat("custom_env/html/index.html", {st_mode=S_IFREG|0664, st_size=162, ...}) = 0
openat(AT_FDCWD, "custom_env/html/index.html", O_RDONLY|O_NONBLOCK) = 10
fstat(10, {st_mode=S_IFREG|0664, st_size=162, ...}) = 0
writev(9, [{iov_base="HTTP/1.1 200 OK\r\nServer: nginx/1"..., iov_len=237}], 1) = 237
sendfile(9, 10, [0] => [162], 162) = 162
close(10) = 0
epoll_ctl(7, EPOLL_CTL_ADD, 9, {EPOLLIN|EPOLLRDHUP|EPOLLET, {u32=1479659969, u64=140236456841665}}) = 0
setsockopt(9, SOL_TCP, TCP_NODELAY, [1], 4) = 0
epoll_wait(7, [{EPOLLIN|EPOLLRDHUP, {u32=1479659969, u64=140236456841665}}], 512, 65000) = 1
recvfrom(9, "", 1024, 0, NULL, NULL) = 0
close(9)
epoll_wait(7,
其中最後一個系統呼叫 epoll_wait
的狀態為正在 blocking 等待 event。
GitHub repo: https://github.com/firelzrd/bore-scheduler BORE 排程器著重在透過犧牲些許 fairness 來換取較低的 interactive task 的 scheduling latency。此外,其建構在 CFS 之上,並只對更新 vruntime 的程式碼做調整,整體改動相對其他非官方 CPU 排程器 (例如:CacULE, TT, Baby, Project C, MuQSS ^本文最下方提供相關超連結^) 可以說是相當小。 burst time 機制 BORE 在 sched_entity 結構體中加入一名為 burst_time 的成員,用於紀錄給定 schedule entity 總共的 CPU time (實際使用 CPU 的時間),並輔助 burst score (用於取得 task 權重值的 index) 的計算,burst score 越高 (使用越多 CPU 時間),代表 task 越不可能是 interactive task,因此 vruntime 增加的幅度就越大,以使得 interactive task 有較好的 scheduling latency 表現: @@ -885,6 +897,19 @@ static void update_curr(struct cfs_rq *cfs_rq) curr->sum_exec_runtime += delta_exec; schedstat_add(cfs_rq->exec_clock, delta_exec);
May 22, 2022本工具用途為量化 scheduling latency / OS jitter。 量化方法 在各個處理器核上綁定 (pin) 一個執行緒,並以 clock_nanosleep() 進行 1 us 的 sleep。 在 sleep 結束後,呼叫 clock_gettime() 獲取當下 timestamp,並將其與原先指定的 wakeup 時間相減,所得的差即為 scheduling latency / OS jitter。 從上述介紹,我們可推斷 jitterdebugger 生成的 task 為 interactive task,因為其相關 task 大部分時候在 sleep。 使用方式
May 22, 2022BPF (Berkeley Packet Filter) eBPF (extended BPF) is traditionally used to safely and securely accelerate the network path in Linux with custom logic specified by userspace. Notable changes from cBPF (classic BPF) to eBPF: 32-bit reg -> 64-bit reg 2 general purpose reg -> 10 general purpose reg + 1 frame pointer reg introduction of JIT compiler upgraded instruction set, but remains backward-compatibility to cBPF
Oct 12, 2021contributed by < flawless0714 > 自我檢查清單 你是否詳閱 手機裡頭的 ARM 處理器:系列講座 呢?請紀錄學習過程中遇到的問題 請解釋 AArch64 個別通用暫存器的作用,依據 Linux on AArch64 ARM 64-bit Architecture 的描述,搭配實際的程式碼說明。提示: 簡報第 19 頁附有參考資訊 回答
Sep 19, 2021or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up