Helpex - Trao đổi & giúp đỡ Đăng nhập

Khắc phục sự cố với một cuộc tìm hiểu sâu về Tương tác trong Quang phổ sử dụng ...

Bạn không muốn đọc? Chỉ cần xem ảnh chụp màn hình 30 giây này về chi tiết quang phổ trong csysdig.


Bối cảnh về Quang phổ Sysdig

Khoảng một năm trước, tôi đã xuất bản một  bài đăng trên blog  có một máy đục sysdig mới được gọi là  quang phổ . Tôi khuyên bạn nên đọc nó, nhưng nếu bạn không có thời gian, đây là bản tóm tắt về cách nó hoạt động:

  • Nó bắt mọi cuộc gọi hệ thống (ví dụ: mở, đóng, đọc, ghi, ổ cắm, v.v.) và nó đo độ trễ của cuộc gọi cứ sau 2 giây. Nó sắp xếp các cuộc gọi thành các nhóm từ 1 nano giây đến 10 giây.
  • Biểu đồ quang phổ sử dụng màu sắc để cho biết có bao nhiêu cuộc gọi trong mỗi nhóm
    • Màu đen có nghĩa là không có cuộc gọi nào trong lần lấy mẫu cuối cùng
    • Các sắc thái của màu xanh lá cây có nghĩa là 0 đến 100 cuộc gọi
    • Màu vàng có nghĩa là hàng trăm cuộc gọi
    • Màu đỏ có nghĩa là hàng nghìn cuộc gọi trở lên

Do đó, bên trái của biểu đồ có xu hướng hiển thị nội dung nhanh, trong khi bên phải hiển thị nội dung chậm.

Khắc phục sự cố với một cuộc tìm hiểu sâu về Tương tác trong Quang phổ sử dụng ...









Quang phổ rất tốt trong việc hiển thị các mẫu và ngoại lệ trong hành vi của một hệ thống hoặc ứng dụng. Tuy nhiên, cho đến giờ bạn vẫn để các thiết bị của riêng mình khắc phục sự cố "điều gì gây ra vị trí này trong biểu đồ?"

Với một chút công việc nữa, tôi đã có thể đưa nó vào giao diện người dùng ncurses dòng lệnh của csysdig, sysdig và cũng nâng cao nó để hữu ích hơn.

Làm cho Quang phổ tương tác trong Csysdig

Bao gồm cả biểu đồ quang phổ trong một giao diện người dùng tương tác như csysdig giúp bạn có thể làm phong phú nó theo một vài cách hay: lựa chọn tùy ý và đi sâu vào các sự kiện.

Bây giờ có thể áp dụng rất dễ dàng biểu đồ quang phổ cho các lựa chọn tùy ý trong csysdig bằng cách nhấp vào F12 (đối với biểu đồ quang phổ đầy đủ) hoặc SHIFT + F12 (đối với biểu đồ quang phổ chỉ bao gồm hoạt động I / O của tệp). Ví dụ: bạn có thể dễ dàng xem thông tin biểu đồ quang phổ cho một quá trình, một thư mục, một tệp, một vùng chứa hoặc  nhờ sự tích hợp của csysdig với Kubernetes , một nhóm hoặc một dịch vụ. Việc có một hình dung như vậy chỉ bằng một lần gõ bàn phím giúp bạn dễ dàng sử dụng nó để khám phá và khắc phục sự cố.

Thú vị hơn nữa, bây giờ bạn có thể sử dụng chuột để kéo qua các khu vực của một hình phổ và quan sát các sự kiện thuộc khu vực đó trong quang phổ.

Khắc phục sự cố với một cuộc tìm hiểu sâu về Tương tác trong Quang phổ sử dụng ...

Một vùng chọn hình chữ nhật trong quang phổ cô lập các sự kiện thuộc  phạm vi độ trễ  (chiều rộng của hình chữ nhật) trong  một khoảng thời gian nhất định  (chiều cao của hình chữ nhật).

Sau khi lựa chọn được thực hiện, bạn sẽ được đưa đến một trang có các sự kiện tôn trọng các tiêu chí của lựa chọn.

Bên cạnh việc thú vị một cách tích cực, chức năng xem chi tiết này có xu hướng rất hữu ích. Bây giờ, câu trả lời của bạn chỉ là một cú kéo chuột.

Đây là một ví dụ.

Ghi vào đĩa trong C, fwrite () vs write ()

Chúng ta sẽ giới thiệu hai chương trình C đơn giản sau:

    #include <stdlib.h>
    #include <fcntl.h>

    int main()
    {
        int j;
        char* buf = (char*)malloc(5000 * 1000);
        int fd;

        fd = open("write.bin", O_CREAT | O_WRONLY);

        for(j = 0; j < 5000; j++)
        {
            write(fd, buf, j * 1000);
        }
    }

Và:

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
        int j;
        char* buf = (char*)malloc(5000 * 1000);

        FILE* f;
        f = fopen("write.bin", "w+");

        for(j = 0; j < 5000; j++)
        {
            fwrite(buf, j * 1000, 1, f);
        }
    }

Cả hai đều làm những việc giống hệt nhau — chúng thực hiện 5000 lần ghi với kích thước ngày càng tăng lên đĩa. Cái đầu tiên (ở trên cùng) hoạt động ở cấp bộ mô tả tệp, trong khi cái thứ hai sử dụng thư viện I / O tiêu chuẩn C.

Chúng ta hãy nhìn vào quang phổ của chương trình đầu tiên:

Khắc phục sự cố với một cuộc tìm hiểu sâu về Tương tác trong Quang phổ sử dụng ...













Như mong đợi, độ trễ tăng lên với kích thước bộ đệm ghi với tốc độ khá đều đặn. Nếu chúng ta quan sát kích thước của đĩa ghi bằng cách đi sâu xuống từ bất kỳ phần nào của biểu đồ, chúng ta sẽ dễ dàng thấy rằng chúng tương ứng với những thứ mà chương trình chỉ định.

Khắc phục sự cố với một cuộc tìm hiểu sâu về Tương tác trong Quang phổ sử dụng ...





Ba dấu chấm riêng biệt ở bên phải của hình phổ là các bản ghi chậm, mất từ ​​nửa giây đến một giây, có thể là do bộ nhớ cache của hệ điều hành tuôn ra.

Bây giờ, chúng ta hãy xem xét quang phổ của chương trình thứ hai:

Khắc phục sự cố với một cuộc tìm hiểu sâu về Tương tác trong Quang phổ sử dụng ...













Trong trường hợp này, chúng ta thấy rõ ràng một hành vi hai phương thức, với một vùng hoạt động tính bằng hàng chục micro giây và một vùng khác từ 1 đến 30 mili giây. Chuyện gì đang xảy ra vậy?

Phía bên phải chứa một loạt các ghi kích thước ngày càng tăng tương ứng với kích thước bộ đệm được chỉ định bởi người dùng trong lệnh gọi fwrite (), nhưng chỉ nhỏ hơn một chút. Mặt khác, nếu chúng ta chọn một vùng ở phía bên trái của biểu đồ, chúng ta có thể thấy rõ rằng đây là tất cả 4096 byte ghi trên đĩa.

Khắc phục sự cố với một cuộc tìm hiểu sâu về Tương tác trong Quang phổ sử dụng ...

Những lần viết này nhanh vì chúng nhỏ hơn. Hành vi hai phương thức này là do lớp đệm bổ sung được đưa vào bởi fwrite (). Dữ liệu được lưu trữ bởi fwrite () trước khi được chuyển vào đĩa, 4KB đầu tiên được ghi ngay lập tức và sau đó phần còn lại của bộ đệm được chuyển (thường) trong một giây ghi.

Cách nào là tốt nhất? Có đệm hay không đệm?

Vâng, như thường lệ, nó phụ thuộc. Trong trường hợp trên, với các lần ghi lớn và tuần tự, việc tránh thêm bộ đệm sẽ mang lại độ trễ dễ dự đoán hơn và hiệu suất tốt hơn một chút. Mặt khác, hãy kiểm tra điều gì sẽ xảy ra khi chúng ta thực hiện nhiều lần ghi 1 byte nhỏ:

    #include <stdlib.h>
    #include <fcntl.h>

    int main()
    {
        int j;
        char buf[1];
        int fd;

        fd = open("write.bin", O_CREAT | O_WRONLY);

        for(j = 0; j < 5000000; j++)
        {
            write(fd, buf, 1);
        }
    }

Và:

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
        int j;
        char buf[1];
        FILE* f;

        f = fopen("write.bin", "w+");

        for(j = 0; j < 5000000; j++)
        {
            fwrite(buf, 1, 1, f);
        }
    }

Đây là phổ của chương trình hàng đầu:

Khắc phục sự cố với một cuộc tìm hiểu sâu về Tương tác trong Quang phổ sử dụng ...

Như bạn có thể thấy,  rất nhiều  lệnh gọi hệ thống ghi khiến chương trình mất hàng chục giây để hoàn thành và tạo ra khá nhiều áp lực cho hệ thống:

Khắc phục sự cố với một cuộc tìm hiểu sâu về Tương tác trong Quang phổ sử dụng ...




Mặt khác, đây là phổ của chương trình thứ hai:

Khắc phục sự cố với một cuộc tìm hiểu sâu về Tương tác trong Quang phổ sử dụng ...

Khá ngắn phải không? Mọi thứ được kết hợp thành một vài bộ đệm 4096KB, số lượng lệnh gọi hệ thống rất thấp và chương trình hoàn thành trong vòng chưa đầy nửa giây.

Khắc phục sự cố với một cuộc tìm hiểu sâu về Tương tác trong Quang phổ sử dụng ...

Kết luận

Các quyết định có vẻ không đáng kể, như chọn API nào bạn sử dụng khi ghi vào đĩa, có thể có tác động lớn đến hiệu suất của ứng dụng của bạn.

Sự phức tạp của các hệ thống hiện đại thường gây khó khăn cho việc xác định ý nghĩa của những quyết định này. Việc đo lường mọi thứ có xu hướng cực kỳ quan trọng, đặc biệt là khi kết hợp với hình dung phù hợp và khả năng đi sâu và điều tra.

May mắn thay, sysdig và csysdig rất  dễ cài đặt  và có thể là một trợ giúp quý giá.

16 hữu ích 0 bình luận 2.0k xem chia sẻ

Có thể bạn quan tâm

loading