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?
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ụ.
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
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