Làm thế nào để phát hiện nếu cô lập được kích hoạt?


15

Làm thế nào để phát hiện nếu cô lập được kích hoạt và trên cpus nào, ví dụ như khi bạn kết nối lần đầu tiên trên máy chủ. Điều kiện:

không sinh ra bất kỳ quá trình để xem nơi nó sẽ được di chuyển.

Trường hợp sử dụng là isolcpus=1-7trên 6 lõi i7, dường như không kích hoạt segcpus khi khởi động, và tôi muốn biết liệu nó có thể từ /proc/, /syshoặc bất kỳ phần bên trong hạt nhân nào có thể được đọc trong không gian người dùng, để cung cấp trạng thái kích hoạt rõ ràng của cô lập và cpu nào quan tâm. Hoặc thậm chí đọc cài đặt hoạt động của trình lập lịch biểu là mối quan tâm đầu tiên của cô lập.

Xem xét thời gian hoạt động là rất lớn, đó dmesglà không hiển thị nhật ký khởi động để phát hiện bất kỳ lỗi nào khi khởi động. Câu trả lời cơ bản như " nhìn vào dòng cmd kernel " sẽ không được chấp nhận :)


1
Bạn có thể sử dụng pidstat -C isolcpus. pidstat là từ sysstatgói.
Timothy Pulliam

2
Có thể tôi im lặng, nhưng tôi không thấy bất kỳ liên kết giữa pidstatisolcpus. Bạn có thể xây dựng thêm một chút?
netmonk

Bạn nói rằng bạn cần biết CPU đang chạy trên CPU. Tôi không biết đó isolcpuslà gì , nhưng pidstatcó thể cho bạn biết CPU đang chạy quá trình nào nếu bạn vượt qua -C process_namecờ. Ví dụ pidstat -C topsản xuất như sau. 10:56:52 AM PID %usr %system %guest %CPU CPU Command 10:56:52 AM 3457 0.00 0.00 0.00 0.00 6 top
Timothy Pulliam

2
Ok cảm ơn bạn đã trả lời của bạn. isolcpuslà một tham số kernel sẽ buộc bộ lập lịch không tự di chuyển bất kỳ tiến trình nào nếu chúng bị cô lập. Ví dụ trên 8 máy chủ cpu, isolcpus=1-7trong dòng lệnh kernel, sẽ buộc tất cả quá trình sinh ra được rẽ nhánh bởi init và bất kỳ loại lệnh nào trong shell chỉ chạy trên CPU0. Để chạy một tác vụ trên một cpu bị cô lập, bạn cần khởi chạy nó với tasksetví dụ. Vì vậy, liên quan đến những gì tôi đang hỏi, có vẻ như câu trả lời của bạn không có chủ đề. Dù sao cũng cảm ơn vì đã cố gắng trả lời tôi
netmonk

1
Một cái gì đó như thế này thực sự không nên khó khăn ....
user997112

Câu trả lời:


17

Những gì bạn tìm kiếm nên được tìm thấy trong tập tin ảo này:

/sys/devices/system/cpu/isolated

và ngược lại trong

/sys/devices/system/cpu/present    // Thanks to John Zwinck

Từ drivers/base/cpu.cchúng tôi thấy rằng nguồn được hiển thị là biến kernel cpu_isolated_map:

static ssize_t print_cpus_isolated(struct device *dev,
    n = scnprintf(buf, len, "%*pbl\n", cpumask_pr_args(cpu_isolated_map));
...
static DEVICE_ATTR(isolated, 0444, print_cpus_isolated, NULL);

cpu_isolated_mapchính xác là những gì được thiết lập kernel/sched/core.ckhi khởi động:

/* Setup the mask of cpus configured for isolated domains */
static int __init isolated_cpu_setup(char *str)
{
    int ret;

    alloc_bootmem_cpumask_var(&cpu_isolated_map);
    ret = cpulist_parse(str, cpu_isolated_map);
    if (ret) {
            pr_err("sched: Error, all isolcpus= values must be between 0 and %d\n", nr_cpu_ids);
            return 0;
    }
    return 1;
}

Nhưng như bạn đã quan sát, ai đó có thể đã sửa đổi mối quan hệ của các quá trình, bao gồm cả các quá trình sinh ra daemon cron, systemdv.v. Nếu điều đó xảy ra, các quy trình mới sẽ được sinh ra kế thừa mặt nạ ái lực đã sửa đổi, chứ không phải quy trình được thiết lập bởi isolcpus.

Vì vậy, những điều trên sẽ cung cấp cho bạn isolcpusnhư bạn yêu cầu, nhưng điều đó có thể vẫn không hữu ích.

Giả sử rằng bạn phát hiện ra rằng isolcpusđã được ban hành, nhưng chưa "thực hiện", hành vi không mong muốn này thể xuất phát từ một số quy trình nhận ra rằng nó bị ràng buộc chỉ CPU=0, tin rằng nó ở chế độ đơn xử lý do nhầm lẫn và cố gắng "thiết lập mọi thứ một cách hữu ích đúng "bằng cách đặt lại mặt nạ ái lực. Nếu đó là trường hợp, bạn có thể thử và cách ly CPUS 0-5 thay vì 1-6 và xem điều này có xảy ra hay không.


1
Đã thử nghiệm trên Centos 7.x, lưu ý rằng /sys/devices/system/cpu/possibledường như không phải là 'đảo ngược' tùy thuộc vào cách bạn diễn giải 'đảo ngược'. Ví dụ, nếu .../cpu/isolatedtrở về 2,4vì họ đã bị cô lập, .../cpu/possiblesẽ trở lại 0-191.
bgura

1
Tôi nghĩ rằng hầu hết mọi người sẽ muốn /sys/devices/system/cpu/presentxem CPU nào tồn tại, thay vì /sys/devices/system/cpu/possiblecho thấy CPU nào có thể tồn tại (nhưng hiện tại có thể không tồn tại). Trên một số hệ thống chúng giống nhau, nhưng ngay cả trên một máy tính để bàn khá cơ bản mà tôi đã kiểm tra, chúng không có.
John Zwinck

@JohnZwinck bắt tốt. sửa đổi câu trả lời
LSerni

1
Với cô lập = 0 và 4 lõi, tôi đang nhận / cô lập = 0 và / hiện tại = 0-3.
Stefan Reich

10

Một trong những cách dễ dàng hơn để phát hiện nếu isolcpusđang tư vấn procđể xem tham số nào được truyền cho kernel trong thời gian chạy.

Đối với điều đó, bạn sẽ sử dụng:

$cat /proc/cmdline 
BOOT_IMAGE=/boot/vmlinuz-4.8.0-1-amd64 root=/dev/sda1 ro isolcpus=2,3 quiet

Như bạn có thể thấy, trong ví dụ cụ thể này isolcpus=2,3đã được truyền dưới dạng đối số cho kernel đang chạy.

Bạn cũng có thể sử dụng tasksettrỏ tới PID 1. Vì PID 1 là PID tiêu chuẩn cho tác vụ đầu tiên được khởi chạy bởi kernel, chúng ta có thể xem như một dấu hiệu khá tốt rằng nó sẽ phản ánh xem chúng ta có isolcpuslàm việc hay không. Như trong:

$taskset -cp 1
pid 1's current affinity list: 0,1

So sánh với lscpulệnh trong cùng một máy chủ:

$lscpu | grep CPU.s
CPU(s):                4
On-line CPU(s) list:   0-3
NUMA node0 CPU(s):     0-3

Như có thể thấy, lscpuđang hiển thị 4 CPU / lõi, trong khi tasksetchỉ hiển thị 0,1, vì vậy chương trình isolcpusnày đang hoạt động ở đây.

Hãy xem: Làm thế nào để đảm bảo CPU có sẵn cho một quy trình đang chạy?


Cảm ơn ngài đã trả lời, nhưng tôi sẽ không chấp nhận. tôi đã chỉ định rằng câu trả lời nói về dòng lệnh kernel sẽ không được chấp nhận. Tôi rõ ràng biết về /proc/cmdlineđó là bản sao chính xác của nội dung của grub.conftập tin. Đây không phải là những gì tôi yêu cầu! Dù sao cũng cảm ơn bạn
netmonk

Tôi đã thêm vào câu trả lời.
Rui F Ribeiro

1
Ai đó trước đây đã sửa đổi mối quan hệ của processus với tasket là gì? Điều gì sẽ xảy ra nếu ai đó chỉ thiết lập ái lực với cpu 0, nó có cung cấp cho tôi bất kỳ thông tin nào về việc kích hoạt hay không cách ly cpu không?
netmonk

1

Bạn có thể kiểm tra Cpus_allowedCpus_allowed_list cho quy trình shell hiện tại để xem cpus nào được bảo lưu

cat /proc/$$/status|tail -6

ví dụ

Cpus_allowed_list:      0-1, 3-5

có nghĩa là cpu = 2 được bảo lưu isolcpustrên máy chủ 6 cpus


2
Thật ra ... không. Nó cho thấy CPU là gì trong mặt nạ ái lực được kế thừa bởi quá trình shell hiện tại. Nếu đó là, giả sử, sshvà người ta đã giới hạn mối quan hệ của cha mẹ sshdvới CPU 1 theo cách thủ công , bạn sẽ luôn thấy CPU 1, cho dù isolcpusđã "lấy" hay chưa. Các $$chi nhánh cung cấp cho bạn quá trình kế thừa các giá trị, không phải là hệ thống những bản gốc.
LSerni
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.