Tại sao `strace` cho thấy quá trình này đang chờ đợi điều gì đó?


11

Sự hùng mạnh straceđã làm tôi thất vọng. Sao có thể như thế được?


time foocho thấy foomấ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 foohiể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.


foolà 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


Hmm ... vì chương trình "foo" của bạn không chỉ là một quy trình đơn, quy trình đơn, nên bạn sẽ được phục vụ tốt hơn bằng cách yêu cầu strace theo dõi và gắn vào dĩa. '-ff' là bạn của bạn! :) Sau đó, bạn cũng muốn sử dụng "-o / dev / shm / strace-foo" để điều chỉnh tất cả các tệp đầu ra xử lý strafe vào một vị trí. Chỉ là một gợi ý.
Jesse Adelman

@JesseAdelman Tôi nghĩ chỉ journalctlchạy một quy trình. Tôi có cảm giác journalctlsử 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. timenhì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ì đó). stracekhô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 timekết quả.
sourcejedi

Câu trả lời:


18

Lý do thông thường để đánh vào vấn đề này, là quá trình này đang chặn các lỗi trang. Đây là những lần đọc hoặc có thể ghi vào các tệp được thực hiện thông qua ánh xạ bộ nhớ aka mmap(). Bạn có thể đã nhận thấy một số mmap()trong dấu vết của các cuộc gọi hệ thống.

Nếu bạn đã sử dụng /usr/bin/timechương trình thay vì timedựng sẵn shell, bạn cũng có thể nhận thấy:

0.04user 0.10system 0:02.29elapsed 6%CPU (0avgtext+0avgdata 40464maxresident)k
73632inputs+0outputs (376major+1081minor)pagefaults 0swaps

majorpagefaults là những trang yêu cầu IO hệ thống tập tin. minortrang bị lỗi ít quan trọng hơn (có lẽ chỉ là "bỏ lỡ TLB").

Tôi nghi ngờ inputslà tổng số trang đọc. Hiện tại, tôi nghĩ rằng các trang ánh xạ tệp luôn có cùng kích thước. 4096 byte trong hầu hết các trường hợp, nhưng bạn có thể kiểm tra getconf PAGESIZE.

Vì vậy, con số này đại diện cho ~ 290 megabyte, đọc ở tốc độ hơn 100 megabyte mỗi giây, tốc độ tiêu chuẩn cho một đĩa cứng như của tôi. Giải đáp bí ẩn!


Cũng lưu ý rằng, bạn đang giả sử rằng bạn có toàn bộ CPU miễn phí cho quy trình này. Mặt khác, quá trình đơn giản có thể bị chặn chờ các tiến trình khác mang lại CPU.

stracechỉ hiển thị khi quá trình đi vào (và sau đó rời khỏi) kernel do một cuộc gọi hệ thống. Hoặc khi tín hiệu unix được phát. Tuy nhiên, có những loại ngắt khác stracehoàn toàn không hiển thị. Vì vậy, bao gồm

  • Lỗi trang.
  • Bộ hẹn giờ ngắt. Điều này được sử dụng để chuyển sang một quy trình khác, khi quy trình hiện tại đã hết thời gian được phân bổ trên CPU.

1
Câu trả lời tốt, xin chúc mừng! Điều thực sự quan trọng là phải hiểu những hạn chế của các công cụ mà người ta đang sử dụng. +1; Tôi cũng tận hưởng những subject: unix.stackexchange.com/questions/418354/...unix.stackexchange.com/questions/419697/...
Rui F Ribeiro
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.