Sự hùng mạnh strace
đã làm tôi thất vọng. Sao có thể như thế được?
time foo
cho thấy foo
mất vài giây để chạy ("thực"), nhưng sử dụng thời gian cpu không đáng kể, cả trong không gian người dùng ("người dùng") và trong kernel ("sys"). Đối với những người tò mò, foo
được định nghĩa dưới đây.
Vì vậy, nó dành phần lớn thời gian để chờ đợi một cái gì đó khác, không thực hiện các hướng dẫn CPU. Thông thường, tôi có thể thấy nó đang chờ như thế nào strace
- tức là cuộc gọi hệ thống nào đang chặn trong một khoảng thời gian dài. Thật không may, phương pháp này không hiệu quả.
strace -ttt -T -C -w foo
hiển thị các cuộc gọi hệ thống, được đánh dấu thời gian và tóm tắt về thời gian (thực) dành cho các cuộc gọi hệ thống. Nhưng quá trình đặc biệt này cho thấy là dành thời gian tổng thể (thực tế) không đáng kể trong các cuộc gọi hệ thống.
foo
là thực sự journalctl -b -u dev-hugepages.mount
. Ngoại trừ việc tôi phải thay đổi đối số cuối cùng thành một đơn vị systemd khác nhau mỗi lần để tái tạo điều này. Nói cách khác, sự chậm trễ mà tôi đang điều tra đã xảy ra lần đầu tiên khi tôi cố gắng lấy nhật ký cho bất kỳ một đơn vị systemd nào. EDIT : sau khi trả lời câu hỏi chính, tôi cũng nhận ra lý do tôi gặp vấn đề này khi tái tạo sự chậm trễ .
Thời gian dành cho quá trình này là một vấn đề cụ thể, rõ ràng nó không xảy ra trên tất cả các hệ thống. https://github.com/systemd/systemd/issues/7963
journalctl
chạy một quy trình. Tôi có cảm giác journalctl
sử dụng thêm một luồng cho bất kỳ lý do nào - iirc có một cuộc gọi clone (). Tôi nghĩ điều này có nghĩa là bạn đúng về mặt kỹ thuật, nhưng nó cũng không liên quan đến kỹ thuật cho câu hỏi. time
nhìn toàn bộ quá trình, và đã chỉ ra rằng toàn bộ quá trình này khá buồn ngủ (chặn một cái gì đó). strace
không ngủ đủ giấc Không có vấn đề gì nếu một luồng thứ hai đang ngủ, luồng chính cũng phải rất buồn ngủ để giải thích time
kết quả.