วิธีการตรวจสอบว่ามีการเปิดใช้งาน isolcpus?


15

วิธีการตรวจสอบว่ามีการเปิดใช้งาน Isolcpus และซีพียูตัวใดตัวอย่างเช่นคุณเชื่อมต่อเป็นครั้งแรกบนเซิร์ฟเวอร์ เงื่อนไข:

ไม่วางไข่กระบวนการใด ๆ เพื่อดูว่ามันจะถูกโยกย้าย

กรณีที่ใช้ก็คือว่าisolcpus=1-7เมื่อวันที่ 6 แกน i7 ดูเหมือนว่าจะไม่ได้เปิดใช้งาน isolcpus ที่บูตและฉันอยากจะรู้ว่าถ้าเป็นไปได้จาก/proc/, /sysหรือ internals เคอร์เนลใด ๆ ที่สามารถอ่านได้ใน userspace เพื่อให้สถานะที่ชัดเจนของการเปิดใช้งานของ isolcpus และซีพียูใดที่เกี่ยวข้อง หรือแม้กระทั่งอ่านการตั้งค่าที่ใช้งานของตัวกำหนดตารางเวลาซึ่งเป็นสิ่งแรกที่เกี่ยวข้องโดย isolcpus

พิจารณาว่าสถานะการออนไลน์มีขนาดใหญ่มากซึ่งdmesgจะไม่มีการแสดงรายการบูตเพื่อตรวจหาข้อผิดพลาดเมื่อเริ่มต้น คำตอบพื้นฐานเช่น " look at kernel cmd line " จะไม่ได้รับการยอมรับ :)


1
pidstat -C isolcpusคุณสามารถใช้ pidstat มาจากsysstatแพ็คเกจ
Timothy Pulliam

2
อาจจะเป็น im ใบ้ แต่ฉันไม่เห็นความเชื่อมโยงระหว่างการใด ๆและpidstat isolcpusคุณสามารถอธิบายเพิ่มเติมอีกเล็กน้อยได้หรือไม่
netmonk

คุณบอกว่าคุณจำเป็นต้องรู้ว่าซีพียูทำงานอะไรอยู่ ฉันไม่รู้ว่าisolcpusมันคืออะไรแต่pidstatสามารถบอกคุณได้ว่า CPU ทำงานอย่างไรหากคุณผ่านการ-C process_nameตั้งค่าสถานะ ตัวอย่างเช่นpidstat -C topสร้างดังต่อไปนี้ 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
โอเคขอบคุณสำหรับคำตอบของคุณ isolcpusเป็นพารามิเตอร์เคอร์เนลซึ่งบังคับให้ตัวกำหนดตารางเวลาไม่ย้ายกระบวนการใด ๆ ด้วยตัวเองหากแยกได้ สำหรับตัวอย่างบนเซิร์ฟเวอร์ 8 cpu isolcpus=1-7ในบรรทัดคำสั่งเคอร์เนลจะบังคับให้เกิดกระบวนการทั้งหมดที่แยกจากกันโดย init และคำสั่งใด ๆ ในเชลล์เพื่อให้ทำงานบน CPU0 เท่านั้น ในการรันงานบนซีพียูแบบแยกตัวคุณจะต้องเรียกใช้งานด้วยtasksetตัวอย่าง ดังนั้นเมื่อคำนึงถึงสิ่งที่ฉันถามดูเหมือนว่าคำตอบของคุณอยู่นอกหัวข้อ ขอบคุณที่พยายามตอบฉัน
netmonk

1
สิ่งเช่นนี้ไม่ควรยากจริงๆ ....
user997112

คำตอบ:


17

สิ่งที่คุณมองหาควรอยู่ในไฟล์เสมือนนี้:

/sys/devices/system/cpu/isolated

และสิ่งที่ตรงกันข้าม

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

จากdrivers/base/cpu.cเราเห็นว่าแหล่งที่แสดงเป็นตัวแปรเคอร์เนล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_mapเป็นสิ่งที่ได้รับการกำหนดโดยkernel/sched/core.cที่บูต:

/* 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;
}

แต่เป็นคุณสังเกตเห็นใครบางคนอาจจะมีการปรับเปลี่ยนความสัมพันธ์ของกระบวนการรวมทั้งคนภูต-กลับกลาย, cron, systemdและอื่น ๆ isolcpusถ้าเกิดว่ากระบวนการใหม่จะได้รับการสืบทอดมาจากกระบอกไม้ไผ่หน้ากากเป็นพี่น้องกันแก้ไขไม่ได้หนึ่งชุดโดย

ดังนั้นข้างต้นจะให้isolcpusตามที่คุณร้องขอ แต่นั่นอาจจะไม่เป็นประโยชน์

หากว่าคุณพบว่าisolcpusมีการออกมา แต่ยังไม่ได้ "ทำ" พฤติกรรมที่ไม่พึงประสงค์นี้อาจเกิดขึ้นได้จากกระบวนการบางอย่างที่ตระหนักว่ามันถูกผูกไว้กับเพียงCPU=0เชื่อว่ามันอยู่ในโหมด monoprocessor โดยไม่ตั้งใจและพยายามอย่างเป็นประโยชน์ ขวา "โดยการรีเซ็ตหน้ากากความสัมพันธ์ หากเป็นกรณีนี้คุณอาจลองแยก CPUS 0-5 แทน 1-6 และดูว่าสิ่งนี้เกิดขึ้นหรือไม่


1
ทดสอบบน Centos 7.x โปรดทราบว่า/sys/devices/system/cpu/possibleดูเหมือนจะไม่ 'ย้อนกลับ' ขึ้นอยู่กับว่าคุณตีความ 'ย้อนกลับ' อย่างไร เช่นถ้า.../cpu/isolatedผลตอบแทน2,4เพราะพวกเขาได้รับการแยกจะกลับมา.../cpu/possible 0-191
bgura

1
ฉันคิดว่าคนส่วนใหญ่ต้องการ/sys/devices/system/cpu/presentที่จะแสดงซีพียูที่มีอยู่มากกว่า/sys/devices/system/cpu/possibleที่จะแสดงให้เห็นว่าซีพียูใดที่อาจมีอยู่ (แต่อาจไม่มีอยู่ในปัจจุบัน) ในบางระบบพวกมันเหมือนกัน แต่ถึงแม้ฉันจะตรวจสอบบนเดสก์ท็อปขั้นพื้นฐานแล้วพวกเขาก็ไม่ได้
John Zwinck

@ JohnZwinck จับที่ดี แก้ไขคำตอบ
LSerni

1
ด้วย isolcpus = 0 และ 4 คอร์ฉันได้รับ / isolated = 0 และ / ปัจจุบัน = 0-3
Stefan Reich

10

หนึ่งในวิธีที่ง่ายกว่าในการตรวจสอบว่าisolcpusมีการให้คำปรึกษาprocเพื่อดูว่าพารามิเตอร์ใดที่ส่งผ่านไปยังเคอร์เนลในรันไทม์

เพื่อที่คุณจะใช้:

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

อย่างที่คุณเห็นในตัวอย่างisolcpus=2,3นี้ถูกส่งเป็นอาร์กิวเมนต์ไปยังเคอร์เนลที่กำลังทำงานอยู่

คุณยังสามารถใช้การtasksetชี้ไปที่ PID 1 เนื่องจาก PID 1 เป็น PID มาตรฐานสำหรับงานแรกที่เปิดใช้โดยเคอร์เนลเราสามารถใช้เป็นตัวบ่งชี้ที่ดีว่ามันจะสะท้อนว่าเราisolcpusทำงานอยู่หรือไม่ ในขณะที่:

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

เปรียบเทียบกับlscpuคำสั่งในเซิร์ฟเวอร์เดียวกัน:

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

ตามที่สามารถเห็นได้lscpuแสดง 4 ซีพียู / คอร์ในขณะที่tasksetแสดงเพียง 0,1 ดังนั้นการแสดงนี้isolcpusจึงทำงานได้ที่นี่

ดูที่: วิธีการตรวจสอบความพร้อมใช้งาน CPU เฉพาะสำหรับกระบวนการทำงาน


ขอบคุณที่ให้คำตอบ แต่ฉันจะไม่ยอมรับมัน ฉันระบุว่าคำตอบพูดคุยเกี่ยวกับบรรทัดคำสั่งเคอร์เนลจะไม่ได้รับการยอมรับ เห็นได้ชัดว่าฉันรู้เกี่ยวกับ/proc/cmdlineสิ่งที่เป็นสำเนาที่แน่นอนของเนื้อหาของgrub.confไฟล์ นี่ไม่ใช่สิ่งที่ฉันถาม! ขอบคุณอยู่ดี!
netmonk

ฉันได้เพิ่มคำตอบแล้ว
Rui F Ribeiro

1
มีใครบางคนที่ปรับเปลี่ยนความสัมพันธ์ของ processus ด้วย tasket ก่อนหน้านี้ จะเกิดอะไรขึ้นถ้ามีคนตั้งค่าเริ่มต้นความสัมพันธ์กับ cpu 0 เท่านั้นมันจะให้ข้อมูลเกี่ยวกับการเปิดใช้งานหรือไม่กับ cpu ของฉันหรือไม่?
netmonk

1

คุณสามารถตรวจสอบCpus_allowedและCpus_allowed_listสำหรับกระบวนการเชลล์ปัจจุบันเพื่อดูซีพียูที่ถูกสงวนไว้

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

สำหรับเช่น

Cpus_allowed_list:      0-1, 3-5

หมายความว่า cpu = 2 ถูกสงวนไว้โดยisolcpusบนเซิร์ฟเวอร์ 6 cpus


2
ที่จริง ... ไม่ มันแสดงให้เห็นว่าซีพียูใดที่อยู่ในรูปแบบของความสัมพันธ์ที่สืบทอดโดยกระบวนการเชลล์ปัจจุบัน หากเป็นเช่นนั้นให้พูดsshและมีข้อ จำกัด เรื่องความสัมพันธ์ของพาเรนต์sshdกับซีพียู 1 ด้วยตนเองคุณจะเห็นซีพียู 1 เสมอไม่ว่าจะisolcpusมี "ถ่าย" หรือไม่ $$สาขาจะช่วยให้คุณกระบวนการสืบทอดค่านิยมไม่ใช่ต้นฉบับคนระบบ
LSerni
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.