Điểm:1

Đồng hồ POSIX trong máy ảo "thực" đến mức nào?

lá cờ it

Giới thiệu:

Thời gian là hệ điều hành như Linux thường được lấy từ chip đồng hồ (RTC) hoặc được duy trì bởi phần mềm bằng cách sử dụng các ngắt định kỳ hoặc một số thanh ghi phần cứng (ví dụ: bộ đếm chu kỳ TSC của CPU) để triển khai.

Rõ ràng là trong một máy ảo không có quyền truy cập phần cứng trực tiếp (ví dụ: vào RTC), vì vậy việc giữ thời gian chính xác có thể khó khăn.

Cụ thể, tôi đang thắc mắc về hai triển khai đồng hồ POSIX: CLOCK_REALTIMECLOCK_MONOTONIC (có nhiều).

nhiễu loạn

Có hai "rối loạn" lớn mà tôi đang xem xét:

  1. "CPU overcommitting": cung cấp nhiều CPU ảo cho máy ảo hơn so với vật lý
  2. "Di chuyển trực tiếp": Di chuyển VM từ máy này sang máy khác "mà không" ảnh hưởng đến hoạt động

Hoạt động binh thương

Các quy trình đang chạy trong một hệ điều hành trên phần cứng trần chỉ bị gián đoạn bởi hệ điều hành (lúc đó có quyền kiểm soát). Vì vậy, hệ điều hành có thể giữ thời gian dễ dàng.

hoạt động của máy ảo

Một hệ điều hành chạy trong máy ảo không liên tục có quyền kiểm soát CPU. Ví dụ: nếu HĐH "không có CPU", nó không thể xử lý các ngắt hẹn giờ. Đổi lại, điều đó có thể khiến các ngắt hẹn giờ bị mất hoàn toàn, bị trì hoãn bởi một số lượng dường như ngẫu nhiên (jitter) hoặc thậm chí có thể được xử lý theo trình tự nhanh (hiện đang xử lý các ngắt "trễ"). Tương tự như vậy, đồng hồ sẽ không tiến triển tuyến tính như mong đợi.

Lựa chọn

  • CLOCK_REALTIME: Nếu HĐH thiếu CPU, đồng hồ thời gian thực có thể bị chậm lại (thiếu phía sau) hoặc thỉnh thoảng nhảy về phía trước để theo kịp
  • CLOCK_MONOTONIC: Nếu HĐH bị thiếu CPU, đồng hồ thời gian thực có thể bị chậm lại (liên quan đến các máy ảo khác hoặc thời gian treo tường) hoặc thỉnh thoảng nhảy về phía trước để theo kịp

Các hiệu ứng

  • CLOCK_REALTIME: Rõ ràng là nếu đồng hồ thời gian thực chậm, nó không thể được sử dụng làm thước đo thời gian tuyệt đối, nhưng nó sẽ có vẻ nhất quán trong VM. Nếu đồng hồ tiếp tục chạy bằng cách nhảy về phía trước một lượng thời gian thay đổi, thì nó có thể được sử dụng làm thước đo tuyệt đối, nhưng sẽ không tốt khi đo bất kỳ hiệu suất (thời lượng) nào trong VM.
  • CLOCK_MONOTONIC: Tăng đồng hồ đơn điệu chỉ khi VM "có CPU" sẽ cung cấp chế độ xem nhất quán về thời gian đã trôi qua trong VM. Làm cho đồng hồ nhảy về phía trước lượng thời gian thay đổi sẽ ngăn việc sử dụng các phép đo hiệu suất (thời lượng) trong VM.

Di chuyển trực tiếp

Khi di chuyển trực tiếp yêu cầu sao chép gigabyte RAM từ nút này sang nút khác, sẽ có một số "thời gian đóng băng" khi VM không thể chạy, giả sử là 3 giây.

Bây giờ, thời gian thực cũng nên nhảy về phía trước thêm 3 giây hay nó sẽ mất ba giây cho đến khi được sửa chữa thủ công hoặc tự động vào một thời điểm sau đó? Tương tự như vậy, khi đồng hồ đơn điệu đang được sử dụng để đo "thời gian hoạt động", có nên tính đến ba giây đó bằng cách thêm chúng hay nên tính đến thời điểm VM thực sự có CPU?

CPU hoạt động quá mức

Giống như ở trên, nhưng có nhiều độ trễ ngắn thường xuyên hơn thay vì thỉnh thoảng lớn hơn.

câu hỏi

Xen sử dụng cách tiếp cận nào?

Làm thế nào để VMware xử lý điều đó? Có tùy chọn cấu hình? (Tôi biết rằng trong Xen, các máy ảo có thể được đồng bộ hóa từ trình ảo hóa hoặc chạy độc lập (ví dụ: được đồng bộ hóa từ bên ngoài bằng cách sử dụng NTP))

Có bất kỳ "thực hành tốt nhất" nào không?

Điểm:1
lá cờ jo

POSIX (và Linux nói chung) không bao giờ thực sự có bộ hẹn giờ được đảm bảo theo nghĩa nếu bạn đặt thứ gì đó ở chế độ ngủ, bạn có thể mong đợi nó thức dậy vào một thời điểm chính xác nhất định. Bạn chỉ có thể đảm bảo rằng việc đánh thức diễn ra SAU thời điểm đã nêu, không chính xác vào thời điểm đó và chẳng bao giờ trước nó*.

Linux không phải là thời gian thực và thực sự chỉ cố gắng hết sức.

Từ người đàn ông 2 nanosleep tuân thủ POSIX:

nanosleep() tạm dừng việc thực thi chuỗi cuộc gọi cho đến khi một trong hai ít nhất thời gian được chỉ định trong *req đã trôi qua hoặc việc gửi một tín hiệu kích hoạt lời gọi của trình xử lý trong luồng gọi hoặc kết thúc quá trình.

Nếu bạn đang mong đợi các dấu tích đáng tin cậy, thì vấn đề có nhiều khả năng là bạn không có kinh nghiệm để quản lý một trang trình bày bên trong một cửa sổ nhất định.

Đề xuất của tôi ở đây là hãy suy nghĩ lại về thiết kế ứng dụng của bạn để kém tin cậy hơn khi đánh thức chính xác hoặc có một dự phòng an toàn trong trường hợp có sự chậm trễ không mong muốn.

I E

  • Phần mềm bị hủy bỏ do một số bất thường về độ trễ.
  • Phần mềm khi đánh thức nhận thấy sự khác biệt so với một số nguồn thời gian có thẩm quyền khác và 'bước' ý tưởng về lần đánh thức tiếp theo để bù lại.
  • Bạn in một cảnh báo hoặc cung cấp một số thông báo khác.

Thật không hợp lý khi nghĩ rằng thời gian là đáng tin cậy trong một hệ thống có thể áp dụng trước. Ngay cả trên kim loại trần.

  • Non-Maskable Interrupts không thể bị chặn.
  • Tải cao có nghĩa là bạn vừa lên lịch trong một thời gian dài.
  • Việc gián đoạn CPU được gọi bởi phần cứng có thể gây ra sự chậm trễ.
  • Các lỗi trang nhỏ và lớn có thể tạo ra độ trễ rất lâu giữa các lần đánh thức hẹn giờ.
  • Phân bổ bộ nhớ trên các ngân hàng bộ nhớ không thuộc sở hữu của CPU thêm độ trễ.

Đây thực sự chỉ là một chức năng của điện toán x86 hiện đại.

Ít nhất là trên KVM, có một nguồn đồng hồ được gọi là 'kvm-clock', được cho là đại diện cho các tích tắc từ trình ảo hóa cơ bản bất kể có bất kỳ độ trễ không xác định nào trong VM. Bạn có thể tìm thấy tệp đó và những gì bạn đã đặt trong đường dẫn này: /sys/devices/system/clocksource/clocksource*/current_clocksource và xem những lựa chọn của bạn là gì /sys/devices/system/clocksource/clocksource*/available_clocksource.

Nhưng một lần nữa, máy chủ bên dưới có thể có độ trễ riêng. Vì vậy, nó chỉ là con rùa đi xuống..

Đừng dựa vào đảm bảo thời gian thực không tồn tại. Xây dựng phần mềm để đối phó với sự chậm trễ không mong muốn hoặc ít nhất là biết về chúng.

NTP nói chung là toàn bộ giao thức nhằm xử lý vấn đề về thời gian, thời gian nào là 'chính xác' và phải làm gì để xử lý các thay đổi về thời gian. Đó là một vấn đề khá phức tạp.

Cách tốt nhất là bạn muốn thiết lập hệ thống để làm cho vấn đề khó xảy ra theo thống kê, hãy nghĩ xem điều gì (nếu có) sẽ tạo thành cơ quan đáng tin cậy về thời gian trong ứng dụng của bạn và sau đó là cách bạn muốn xử lý các sự kiện không chắc xảy ra khi thời gian thay đổi .

Có thể bạn thiết lập một số SLA nói rằng thời gian sẽ không chính xác khi kiểm tra 1000000 mẫu. Điều đó -- có thể xảy ra, mặc dù không chắc về mặt thống kê là bọ ve đã tắt.

Cách tôi xem xét thời gian khi làm việc với các nhóm có hệ thống khác nhau mà tất cả đều có liên quan với nhau, đó là điều quan trọng hơn là vị trí thời gian của chúng* nằm trong một cửa sổ khác biệt nhỏ. Ở mức độ đó, tôi sẽ có một thiết lập máy chủ thời gian cục bộ sử dụng một số nguồn có thẩm quyền, sau đó tất cả các máy tính trong nhóm đó sẽ đồng bộ hóa với hệ thống cục bộ đó. Máy chủ thời gian cục bộ có độ trễ rất thấp giúp giảm rung pha cục bộ và tất cả các máy chủ sẽ được đồng bộ hóa rất chặt chẽ.


  • Một số triển khai hẹn giờ sử dụng bộ xử lý tín hiệu để bẫy các sự kiện. IE SIGALRM, nếu bạn gửi một quy trình tín hiệu ALRM bên ngoài bộ hẹn giờ, nó sẽ thức dậy trước nó.

  • Địa phương ở đây sẽ là tất cả các máy tính có liên quan logic với nhau, tất cả đều nằm trong khoảng thời gian có lẽ là vài mili giây với nhau. Nhưng chúng có thể khác nhau rất nhiều giữa các địa phương khác, IE là một nhóm các hệ thống có độ trễ cách xa 500 mili giây.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.