Kho tháng 2/2018

Tue Feb 13 12:48:58 +07 2018

Debug systemctl start "oneshot service"

Dummy unit file

[Unit]
Description=Dummy

[Service]
Type=oneshot
ExecStart=/bin/true

Turn on debug logging

# remember to turn it back to info later
systemd-analyze set-log-level debug

Start and watch journalctl -f --unit=dummy

dummy.service: Trying to enqueue job dummy.service/start/replace
dummy.service: Installed new job dummy.service/start as 6758
dummy.service: Enqueued job dummy.service/start as 6758
dummy.service: Failed to set blkio.weight: No such file or directory
dummy.service: Passing 0 fds to service
dummy.service: About to execute: /bin/true
dummy.service: Forked /bin/true as 22141
dummy.service: Changed dead -> start
Starting Dummy...
dummy.service: Child 22141 belongs to dummy.service
dummy.service: Main process exited, code=exited, status=0/SUCCESS
dummy.service: Changed start -> dead
dummy.service: Job dummy.service/start finished, result=done
Started Dummy.
dummy.service: Collecting.
dummy.service: Collecting.

Associated calls

src/core/manager.c:  manager_add_job()
src/core/job.c:      -> job_install()
src/core/manager.c:  manager_add_job() (cont)
# Failed to set blkio.weight
src/core/service.c:  service_spawn()
src/core/execute.c   -> exec_spawn()
src/core/execute.c   -> exec_spawn()
src/core/service.c:  service_set_state()
src/core/unit.c:     unit_status_emit_starting_stopping_reloading()
                      by job_perform_on_unit() ??
src/core/manager.c:  invoke_sigchld_event()
src/core/manager.c:  -> service_sigchld_event()
src/core/service.c:  service_set_state()
                      by service_enter_signal()
                       by service_enter_stop()
                        by service_enter_running()
                         by service_enter_start_post()
                          by service_sigchld_event()
src/core/job.c:      job_finish_and_invalidate()
                      by unit_notify()
                       by service_set_state()
src/core/job.c:      job_emit_status_message()
                       by job_finish_and_invalidate()

Not shown in the log is the call

job_add_to_dbus_queue(j);

in job_finish_and_invalidate(), whose message should end up in systemctl where it reports success/error, probably. Then how the hell could

systemctl start dummy

hang after the dummy service has started?


Tác giả: pclouds | Liên kết tĩnh

Thứ năm, 08 Tháng hai năm 2018 18:38:28 ICT

Sau khi coi Falcon 9 hạ cánh song song chục lần, có chán không?

Không. Mèn ơi nhìn cứ như phim chiếu lùi!

And hopefully we inspire the public to get excited about space again

Ố dè. Đờ "public" (bao gồm đúng một người) đang rất "excited" về không gian. BFR bay sẽ là dấu ấn quan trọng kế tiếp trong lịch sử hàng không vũ trụ.


Tác giả: pclouds | Liên kết tĩnh

Wed Feb 7 15:15:55 +07 2018

Paravirt patching trong kernel

Khi bật CONFIG_PARAVIRT=y, cùng một kernel có thể dùng để chạy cả trong môi trường máy thật lẫn máy ảo. Nhiều lệnh cấp thấp trong paravirt có thể phải thay đổi để "nói chuyện" với hypervisor hiệu quả hơn (tại vì đây là paravirt không phải full virtualization). Để tránh overhead khi paravirt kernel chạy trong máy thật, linux kernel tiếp tục "patch piếtch như điên".

Tất cả những lệnh có thể hành xử khác biệt trong máy ảo được lưu trong include/asm/paravirt.h. Những hàm này được phát sinh code đặc biệt (thông qua PVOP_VCALL.. macros) để có thể thay đổi về sau. Code gốc đơn giản: gọi một con trỏ hàm (dĩ nhiên là chậm thấy ớn).

Code mới được ghi vào thông qua một tập các hàm paravirt_patch_* trong arch/x86/kernel/paravirt.c. Toàn bộ quy trình patch bắt đầu ở apply_paravirt(). Hàm này được chạy lúc khởi động để patch toàn kernel (start_kernel() -> check_bugs() -> alternative_instructions() -> apply_paravirt()) và chạy khi module mới được nạp (module_finalize()).

Bài học là gì? Đừng có đọc code rồi đoán performance. Code nhìn đơn giản: lệnh gọi hàm gián tiếp nhất định là chậm. Trên thực tế nó chạy cái code khác, tại vì nó không còn "gián tiếp" gì nữa ráo...

Kernel điên lắm.

PS. page table switch trên x86 nằm trong switch_mm() (vậy mà đoán không ra) trong mmu_context.h


Cập nhật 1 lần. Lần cuối: Wed Feb 07 08:43:34+0011 2018

Tác giả: pclouds | Liên kết tĩnh | kernel

Wed Feb 7 10:09:31 +07 2018

Falcon Heavy bay!

Dấu ấn lịch sử lần 1 của SpaceX, Falcon 9 hạ cánh an toàn. Dấu ấn lần hai, "Don't panic!" bay vào không gian (và hai Falcon 9 hạ cánh song song). Ars Technica


Tác giả: pclouds | Liên kết tĩnh