เมื่อเร็ว ๆ นี้เราได้เปลี่ยนสภาพแวดล้อมการผลิตของเราเป็น 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.usage
60% มา (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 และขีด จำกัด ของแอพพลิเคชั่นเหล่านี้ได้อย่างไร?