ข้อขัดแย้งในการใช้งาน Kubernetes CPU & Metrics Container Docker


9

เมื่อเร็ว ๆ นี้เราได้เปลี่ยนสภาพแวดล้อมการผลิตของเราเป็น Kubernetes ฉันต้องการบังคับใช้ขีด จำกัด ของ CPU บนคอนเทนเนอร์ ฉันได้รับการวัด CPU ที่ขัดแย้งกันซึ่งไม่สอดคล้องกัน นี่คือการตั้งค่าของฉัน:

  • ตัวแทน DataDog ทำงานเป็น Daemonset
  • แอปพลิเคชั่นที่มีอยู่ทำงานโดยไม่มีขีด จำกัด ของ CPU
  • คอนเทนเนอร์ที่สงสัยคือแอปพลิเคชั่น Ruby แบบมัลติเธรด
  • สองตัวชี้วัด: kubernetes.cpu.usage.{avg,max}และdocker.cpu.usage
  • c4.xlarge โหนดคลัสเตอร์ (4 vCPU หรือ 4000m ในเงื่อนไข Kubernetes)

kubernetes.cpu.usage.maxรายงาน ~ 600m สำหรับตู้สินค้าที่เป็นปัญหา docker.cpu.usageรายงาน ~ 60% ตามด้วยข้อ จำกัด ของ CPU 1000m จะเกินความจุที่เพียงพอภายใต้การทำงานปกติ

ฉันตั้งค่า จำกัด ไว้ที่ 1,000m จากนั้นdocker.container.throttlesขึ้นไปอย่างมีนัยสำคัญในขณะที่kubernetes.cpu.usage.maxและยังdocker.cpu.usageคงเหมือนเดิม ระบบทั้งหมดตกลงไปที่หัวเข่าในช่วงเวลานี้ สิ่งนี้ไม่สมเหตุสมผลสำหรับฉัน

ฉันค้นคว้าสถิตินักเทียบท่า ดูเหมือนว่าdocker stats(และ API พื้นฐาน) ทำให้การโหลดเป็นไปตามมาตรฐานของคอร์ CPU ดังนั้นในกรณีของฉันdocker.cpu.usage60% มา (4000m * 0.60) ถึง 2400m ในเงื่อนไขของ Kubernetes อย่างไรก็ตามสิ่งนี้ไม่สัมพันธ์กับหมายเลข Kubernetes ใด ๆ ฉันทำการทดลองอีกครั้งเพื่อทดสอบสมมติฐานของฉันว่าหมายเลข Kubernetes ไม่ถูกต้อง ฉันตั้งค่าขีด จำกัด ไว้ที่ 2,600 เมตร (สำหรับส่วนเสริมพิเศษบางส่วน) สิ่งนี้ไม่ส่งผลให้เกิด throttles ใด ๆ อย่างไรก็ตาม Kubernetes สังเกตว่าการใช้งาน CPU ไม่เปลี่ยนแปลง นี่ทำให้ฉันสับสน

ดังนั้นคำถามของฉันคือ:

  • สิ่งนี้รู้สึกเหมือนเป็นแมลงใน Kubernetes (หรือบางอย่างในกองซ้อนหรือไม่)
  • ความเข้าใจของฉันถูกต้องหรือไม่

คำถามการติดตามของฉันเกี่ยวข้องกับวิธีการกำหนด CPU อย่างถูกต้องสำหรับแอปพลิเคชัน Ruby ภาชนะหนึ่งอันใช้ Puma นี่คือเว็บเซิร์ฟเวอร์แบบมัลติเธรดที่มีจำนวนเธรดที่กำหนดค่าได้ คำร้องขอ HTTP ถูกจัดการโดยหนึ่งในเธรด แอปพลิเคชั่นที่สองคือเซิร์ฟเวอร์แบบประหยัดโดยใช้เซิร์ฟเวอร์เธรด การเชื่อมต่อ TCP ขาเข้าแต่ละครั้งจะถูกจัดการโดยเธรดของตัวเอง เธรดจะออกเมื่อการเชื่อมต่อปิดลง Ruby เป็น GIL ​​(ล็อคการแปลล่ามสากล) ดังนั้นหนึ่งเธรดเท่านั้นที่สามารถเรียกใช้โค้ด Ruby ได้ในแต่ละครั้ง สิ่งนี้อนุญาตให้มีหลายเธรดที่ใช้งาน IO และสิ่งต่างๆเช่นนั้น

ฉันคิดว่าวิธีที่ดีที่สุดคือ จำกัด จำนวนเธรดที่ใช้งานในแต่ละแอปพลิเคชันและประมาณขีด จำกัด CPU ของ Kubernetes ตามจำนวนเธรด กระบวนการไม่ได้ฟอร์กเพื่อให้การใช้งาน CPU ทั้งหมดยากต่อการคาดการณ์

คำถามคือ: จะคาดการณ์การใช้งาน CPU และขีด จำกัด ของแอพพลิเคชั่นเหล่านี้ได้อย่างไร?


คุณลองบนโหนด 1cpu และโหนด 2 cpu เพื่อดูว่าตัวเลขมีความสัมพันธ์อย่างไร (หรือไม่)
Tensibai

คำตอบ:


4

หลายสิ่งที่นี่:

  1. คุณใช้ AWS ec2 ดังนั้นสิ่งที่คุณกำลังทำบนอินสแตนซ์ของคุณสำหรับการวัด CPU กำลังคำนวณ CPU ในระดับไฮเปอร์ไวเซอร์ไม่ใช่ระดับอินสแตนซ์ ในการรันการทดสอบโหลดและตรวจสอบการใช้งาน iostat -ct 1 และ CPU ใน cloudwatch การใช้งานซีพียูใน cloudwatch นั้นมากกว่า 10-20% ที่ iostat จะรายงานเสมอและนั่นเป็นเพราะ iostat จะให้การใช้งาน CPU ในระดับไฮเปอร์ไวเซอร์

  2. ในฐานะที่เป็นนักเทียบท่าเพื่อดูว่าการเปรียบเทียบ kubernetes และตัวเทียบท่าเทียบท่าฉันแนะนำให้เรียกใช้คอนเทนเนอร์ด้วย --cpuset = 1 หรือหมายเลขใด ๆ เพื่ออนุญาตให้คอนเทนเนอร์ทั้งหมดใช้ vCPU เดียวเท่านั้น

  3. นอกจากนี้ใน AWS 1 CPU = 2vcpu มันมีไฮเปอร์เธรดเป็น 2 คุณอาจนำสิ่งนี้มาพิจารณาขณะคำนวณ

  4. ในที่สุดตัวชี้วัดที่ดีที่สุดที่จะใช้เพื่อดูการใช้งาน CPU สำหรับแอปพลิเคชันเฉพาะกำลังใช้ htop และสัมพันธ์กับตัวชี้วัด cloudwatch ของคุณ

  5. ฉันได้สังเกตเห็นบางครั้งนักเทียบท่าภูตปักหมุดตัวเองกับหนึ่งในซีพียูเสมือนจริงและด้วยเหตุนี้เมื่อคุณลดลงเหลือ 1,000m บางทีการตั้งค่าทั้งหมดกำลังช้าลงเนื่องจากการลดลงเกิดขึ้นกับ vpcus ตัวใดตัวหนึ่ง คุณสามารถใช้ mpstat เพื่อดูรายละเอียดของสิ่งนี้

  6. สุดท้ายในระดับโฮสต์คุณสามารถตรึงตัวเชื่อมต่อกับ CPU ตัวเดียวและดูข้อมูลเพิ่มเติม

หวังว่าสิ่งนี้จะนำคุณเข้ามาใกล้ อัปเดตฉันหากคุณพบวิธีแก้ไขปัญหาแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.