Research in compute resource management for cloud-native applications is dominated by the problem of setting optimal CPU limits -- a fundamental OS mechanism that strictly restricts a container's CPU usage to its specified CPU-limits . Rightsizing and autoscaling works have innovated on allocation/scaling policies assuming the ubiquity and necessity of CPU-limits . We question this. Practical experiences of cloud users indicate that CPU-limits harms application performance and costs more than it helps. These observations are in contradiction to the conventional wisdom presented in both academic research and industry best practices. We argue that this indiscriminate adoption of CPU-limits is driven by erroneous beliefs that CPU-limits is essential for operational and safety purposes. We provide empirical evidence making a case for eschewing CPU-limits completely from latency-sensitive applications. This prompts a fundamental rethinking of auto-scaling and billing paradigms and opens new research avenues. Finally, we highlight specific scenarios where CPU-limits can be beneficial if used in a well-reasoned way (e.g. background jobs).
- è«æID: 2510.10747
- ã¿ã€ãã«: CPU-Limits kill Performance: Time to rethink Resource Control
- èè
: Chirag Shetty (UIUC), Sarthak Chakraborty (UIUC), Hubertus Franke (IBM Research), Larisa Shwartz (IBM Research), Chandra Narayanaswami (IBM Research), Indranil Gupta (UIUC), Saurabh Jha (IBM Research)
- åé¡: cs.DC (忣ã³ã³ãã¥ãŒãã£ã³ã°), cs.OS (ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ), cs.PF (æ§èœ)
- çºè¡šææ: 2025幎10æ (arXiv ãã¬ããªã³ã)
- è«æãªã³ã¯: https://arxiv.org/abs/2510.10747
æ¬è«æã¯ãã¯ã©ãŠããã€ãã£ãã¢ããªã±ãŒã·ã§ã³ã®èšç®ãªãœãŒã¹ç®¡çã«ãããäžæ žçã¡ã«ããºã ã§ããCPUå¶é(CPU-Limits)ã«å¯ŸããŠæ ¹æ¬çãªçåãæèµ·ãããåŠè¡ç ç©¶ãšæ¥çå®è·µã®åæ¹ãCPUå¶éãå¿
é ãšèããŠããã«ãããããããèè
ãã¯å®èšŒç蚌æ ãéããŠãCPUå¶éãå®éã«ã¯ã¢ããªã±ãŒã·ã§ã³æ§èœãæå®³ããã³ã¹ããå¢å ãããããšã瀺ããè«æã¯ãã¬ã€ãã³ã·ææåã¢ããªã±ãŒã·ã§ã³ã¯CPUå¶éãå®å
šã«å»æ¢ãã¹ããšäž»åŒµããŠãããããã«ã¯èªåã¹ã±ãŒãªã³ã°ãšèª²éã¢ãã«ã®æ ¹æ¬çãªåèãå¿
èŠã§ããããšãææããäžæ¹ã§ãããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãªã©ã®ç¹å®ã®ã·ããªãªã«ãããCPUå¶éã®åççãªçšéã瀺åããŠããã
ã³ã³ããåããããã€ã¯ããµãŒãã¹ã®CPUãªãœãŒã¹ç®¡çã¯ãã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°åéã®äžæ žç課é¡ã§ãããçŸåšã®äž»æµçã¢ãããŒãã¯ãCPU-Limits (c.limit)ã¡ã«ããºã ãéããŠã³ã³ããã®CPU䜿çšéãå³å¯ã«å¶éããããšã§ããããã®ã¡ã«ããºã ã¯Linuxã®cpu.cfs_quota_usã«åºã¥ããŠå®è£
ãããŠãããããããèè
ãã¯å®éã®éçšç°å¢ã«ãããŠçè«ãšå®è·µã®éã«é¡èãªã®ã£ãããååšããããšã芳å¯ããŠããã
- æ§èœãžã®åœ±é¿: CPUå¶éã«ããã¹ããããªã³ã°ã¯ã¢ããªã±ãŒã·ã§ã³ã¬ã€ãã³ã·ãæ¥æ¿ã«æªåãããã«ã¹ã±ãŒãé害ãåŒãèµ·ããå¯èœæ§ããã
- ã³ã¹ãåé¡: ã¹ããããªã³ã°ãåé¿ããããã«èšå®ãããã»ãŒããã£ããŒãžã³ã«ããã25ïœ45%ã®ãªãœãŒã¹éå°é
眮ãçºçãã
- éçšã®è€éæ§: DevOpsæ
åœè
ã¯è€æ°ã®çްç²åºŠCPUå¶ééã§è€éãªãã¬ãŒããªããè¡ãå¿
èŠããã
æ¢åã®èªåã¹ã±ãŒãªã³ã°ç ç©¶(FIRMãCilantroãAutothrottleãªã©)ã¯ããã¹ãŠCPUå¶éã®å¿
èŠæ§ãšããä»®å®ã«åºã¥ããŠãããå¶éå€ã®æé©åã«çŠç¹ãåœãŠãŠããããã¡ã«ããºã èªäœã«çåãåããŠããªããèè
ãã®åæã«ããããããã®ææ³ã¯CPUå¶éãåé€ãããšæ©èœããªããªãããšãæããã«ãªã£ãã
SRE(ãµã€ãä¿¡é Œæ§ãšã³ãžãã¢)ãžã®èãåã調æ»ãšãªã³ã©ã€ã³è°è«ã®èª¿æ»ãéããŠãèè
ãã¯éçšã³ãã¥ããã£ãCPUå¶éã«ã€ããŠèŠè§£ãåãããŠããããšãçºèŠãããå€ãã®å®åå®¶ã¯ãã§ã«ããã©ãŒãã³ã¹æ¹åã®ããã«CPUå¶éãåé€ãå§ããŠãããããã¯åŠè¡çã®äž»æµçèŠè§£ãšå¯Ÿç
§ããªããŠããã
- åŸæ¥ã®èŠ³å¿µãžã®ææŠ: ã¬ã€ãã³ã·ææåã¢ããªã±ãŒã·ã§ã³ã«ãããCPUå¶éã®å¿
èŠæ§ã«å¯ŸããŠãåããŠäœç³»çã«çåãåããååãªå®èšŒç蚌æ ãæäŸãã
- æ§èœåæ: CPUå¶éãã¬ã€ãã³ã·ãä¿¡é Œæ§ãã³ã¹ãã«åãŒãè² ã®åœ±é¿ã¡ã«ããºã ãæ·±ãåæãã
- ä»£æ¿æ¡ã®èšèš: CPU-Requests (c.req)ã®ã¿ã䜿çšãããªãœãŒã¹ç®¡çã®å®è¡å¯èœæ§ãšå©ç¹ãå®èšŒãã
- æ°ãã©ãã€ã ã®ææ¡: ããã©ãŒãã³ã¹ããŒã¹ã®èª²éã¢ãã«ãšç¡å¶éã®èªåã¹ã±ãŒãªã³ã°èšèšãææ¡ãã
- ãããã¿ã€ãå®è£
: YAAS(Yet Another AutoScaler)ãããã¿ã€ããæ§ç¯ãã51%ã®ãªãœãŒã¹åæžãå®çŸãã
- å¿çšã·ããªãªã®åºå: ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãCPUããŠã³ããªã©ã®ã·ããªãªã«ãããCPUå¶éã®åççãªäœ¿çšã±ãŒã¹ãæç¢ºã«å®çŸ©ãã
ç ç©¶ç®æšã¯ãCPUå¶éã䜿çšããªãå ŽåãCPU-RequestsãšããŒãå©çšçã®æé©åãéããŠããåªããæ§èœ-ã³ã¹ããã¬ãŒããªããå®çŸããããšã«ãããã³ã³ããCPUãªãœãŒã¹ç®¡çã¡ã«ããºã ãåèšèšããããšã§ããã
èè
ãã¯CPUå¶éã®æ§ã
ãªæ§æã·ããªãªãäœç³»çã«åæããããã®æ±ºå®æš(å³1)ãæ§ç¯ãã:
- limit = req: ã³ã¹ãå¢å ãããããã25ïœ45%ã®ã»ãŒããã£ããŒãžã³ãå¿
èŠ
- limit > req:
- å¶éã«å°éããªãå ŽåãäžèŠã§ãã
- å¶éã«å°éããå¯èœæ§ãããå Žåãèªåã¹ã±ãŒãªã³ã°ãããã³ã°ãããããã¬ã€ãã³ã·ãæ¥æ¿ã«æªåãã
èè
ãã¯2ã€ã®ã¬ãã«ããCPU-Requestsã®ã¿ã®äœ¿çšã®å
åæ§ã蚌æãã:
CFSã¹ã±ãžã¥ãŒã©ã®ä¿èšŒ: Linux CFSã¹ã±ãžã¥ãŒã©ã¯æ¯äŸå
¬å¹³æ§ä¿èšŒãæäŸããCPU-Requests r_iãæã€Pod P_iãç·CPU Cã®ããŒãäžã§æäœé (r_i/Σr_j) à C ã®CPUæéãååŸããããšãä¿èšŒããã
ãªãŒã±ã¹ãã¬ãŒã¿ã²ãŒãã£ã³ã°: Kubernetesãªã©ã®ãªãŒã±ã¹ãã¬ãŒã¿ã¯ãããŒãäžã®ãã¹ãŠã®ã³ã³ããã®CPU-Requestsã®åèšãããŒã容éãè¶
ããªãããšãä¿èšŒããCPU-Requestsã絶察çãªæå°ä¿èšŒã«ããã
YAASã¯2ã€ã®äž»èŠãªå¶åŸ¡å€æ°ã«åºã¥ããŠãã:
- Overage (U-R): Podã®å®éã®äœ¿çšéãšå²ãåœãŠéã®å·®
- ããŒãå©çšç (N): PodãååšããããŒãã®ç·CPUå©çšç
æ žå¿çæŠç¥:
- overage ⥠0ãç¶æããSLOéåãå·®ãè¿«ã£ãå Žåã®ã¿ãªãœãŒã¹ãå¢å ããã
- Podç§»è¡ã«ããããŒãå©çšçã®æé©å
- åçŽããã³æ°Žå¹³ã¹ã±ãŒãªã³ã°ã®çµã¿åãã
DeathStarBenchãã2ã€ã®ãã€ã¯ããµãŒãã¹ã¢ããªã±ãŒã·ã§ã³ã䜿çš:
- HotelReservation (HR): ããã«äºçŽã·ã¹ãã
- SocialNetwork (SN): ãœãŒã·ã£ã«ãããã¯ãŒã¯ã¢ããªã±ãŒã·ã§ã³
- ãã©ãããã©ãŒã : Amazon EC2ã¯ã©ã¹ã¿
- è² è·ãã¿ãŒã³: å€åãããªã¯ãšã¹ãè² è·ãå®éã®æ¬çªç°å¢ãã·ãã¥ã¬ãŒã
- è©äŸ¡ææš:
- ãšã³ãããŒãšã³ãã®ããŒã«é
å»¶(P99)
- CPU ãªãœãŒã¹äœ¿çšé
- ã¹ã±ãŒãªã³ã°åæ°ãšåææé
- ã³ã¹ãå¹ç
- åŸæ¥ã®CPUå¶éããŒã¹ã®HPA (Horizontal Pod Autoscaler)
- æåã§æé©åãããCPUå¶éæ§æ
- ç°ãªãã»ãŒããã£ããŒãžã³èšå®(20%ïœ30%)
ã¬ã€ãã³ã·ãžã®åœ±é¿:
- 1ã€ã®Pod(å
š19åäž)ã«ã®ã¿CPUå¶éãèšå®ããããšã§ããšã³ãããŒãšã³ãã®ããŒã«é
å»¶ã5åæªåãã
- CPUå¶éã¯2ã€ã®ã¡ã«ããºã ãéããŠæ§èœãæå®³ãã:åäžãªã¯ãšã¹ãã®ã¹ããããªã³ã°ãšãªã¯ãšã¹ãéã®ãã¥ãŒåœ¢æ
ã³ã¹ãåæ:
- ã¹ããããªã³ã°ãåé¿ããã«ã¯25ïœ45%ã®ãªãœãŒã¹éå°é
眮ãå¿
èŠ
- CPUå¶éãåçŽã«åé€ããããšã§38%ã®ãªãœãŒã¹åæžãå¯èœ
- YAASã¯ããã«51%ã®ãªãœãŒã¹åæžãå®çŸãã
ã¹ã±ãŒãªã³ã°æ§èœ:
- è² è·ã25%å¢å ããå Žåãã¹ã±ãŒãªã³ã°éŸå€ã60%ãã70%ã«äžæãããšSLOæºè¶³æéã4åå¢å ãã
- CPUå¶éãèªåã¹ã±ãŒãªã³ã°ã®æåºŠã«åãŒã圱é¿ã瀺ã
ã»ãŒããã£ããŒãžã³åæ: ç°ãªãã¢ããªã±ãŒã·ã§ã³ã¯ç°ãªãã»ãŒããã£ããŒãžã³ãå¿
èŠãšãã:
- nginx-thrift: 30%
- user-timeline-service: 45%
ãã¥ãŒåœ¢æã¡ã«ããºã : çè«åæãšå®éšæ€èšŒãéããŠãCPUå¶éãããäœãè² è·ã§ãã¥ãŒã圢æããæ¹æ³ã瀺ããCPU-Requestsã¯ãã®åé¡ãçããããªãããšã瀺ãã
ãã«ãããã³ãç°å¢: 2ã€ã®ã¢ããªã±ãŒã·ã§ã³ãå
±åããå ŽåãCPU-Requestsã¯æºæ ããã¢ããªã±ãŒã·ã§ã³ãããŒã¹ãã£ã³ã°ã¢ããªã±ãŒã·ã§ã³ã®åœ±é¿ãã广çã«ä¿è·ã§ããããCPUå¶éã¯éã«æ§èœãæªåãããããšãå®éšã瀺ãã
ã«ã¹ã±ãŒãé害: CPUå¶éã«ããé·ããã¥ãŒã¯Podå
ã®ã¡ã¢ãªè¶
éãåŒãèµ·ãããPodã®åèµ·åã«ã€ãªãããããã«ä»ã®Podãå¶éã«éãããããªã¯ãšã¹ããã¿ã€ã ã¢ãŠãããå¯èœæ§ãããã
è«æã¯æè¿ã®ããããã£ã¢äŒè°ã®èªåã¹ã±ãŒãªã³ã°ç ç©¶ãäœç³»çã«åæãããããããã¹ãŠCPUå¶éã«äŸåããŠããããšãçºèŠãã:
- FIRM: 匷ååŠç¿ã䜿çšããŠCPUå¶éãæé©å
- Cilantro: ãªã³ã©ã€ã³ãã£ãŒãããã¯ã«åºã¥ããŠãªãœãŒã¹å²ãåœãŠã調æŽ
- Autothrottle: SLOç®æšãåŠçããåå±€ã¢ãããŒã
- Ursa: åæé§ååãªãœãŒã¹ç®¡ç
- Kubernetes QoSåé¡ã¯éèŠãªã³ã³ããã«CPUå¶éã®èšå®ãèŠæ±ãã
- ã¯ã©ãŠããµãŒãã¹ãããã€ã(GCP Autopilotãªã©)ã¯èªåçã«CPUå¶éãé©çšãã
- ãã«ãããã³ãæäœ³å®è·µã¯CPUå¶éã®äœ¿çšãæšå¥šãã
- CPUå¶éã¯æå®³: ã¬ã€ãã³ã·ææåã¢ããªã±ãŒã·ã§ã³ã®å ŽåãCPUå¶éã¯æå®³(ã¹ããããªã³ã°ãåŒãèµ·ãã)ã§ãããç¡çš(å°éããªã)ã§ãã
- CPU-Requestsã¯å
å: ææ°ã®ãªãŒã±ã¹ãã¬ãŒã¿ãšã¹ã±ãžã¥ãŒã©ã®ä¿èšŒã«ãããCPU-Requestsã¯ãªãœãŒã¹åé¢ãæäŸããã®ã«ååã§ãã
- æ°ããèšèšç©ºé: CPUå¶éã®åé€ã«ãããoverageãšããŒãå©çšçã«åºã¥ãæ°ããæé©åã®æ¬¡å
ãéããã
- ãã©ãã€ã ã·ããã®å¿
èŠæ§: èªåã¹ã±ãŒãªã³ã°ãšèª²éã¢ãã«ã®åèšèšãå¿
èŠã§ãã
- é©çšç¯å²: äž»ã«ã¬ã€ãã³ã·ææåã¢ããªã±ãŒã·ã§ã³ã察象ãšããããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãªã©ã®ã·ããªãªã§ã¯CPUå¶éãäŸç¶ãšããŠå¿
èŠ
- å®éšèŠæš¡: å®éšã¯ç¹å®ã®ãã€ã¯ããµãŒãã¹ãã³ãããŒã¯ã«åºã¥ããŠãããããå€§èŠæš¡ãªæ€èšŒãå¿
èŠ
- æ¬çªéçš: ãããã¿ã€ãYAASã¯æ¬çªç°å¢ã§ã®äœ¿çšã®ããã«ãããªããšã³ãžãã¢ãªã³ã°ãå¿
èŠ
- ãšã³ã·ã¹ãã : ãªãŒã±ã¹ãã¬ãŒã¿ãç£èŠã課éã·ã¹ãã ã®å調çãªå€æŽãå¿
èŠ
- ã€ã³ããªãžã§ã³ãã¹ã±ãžã¥ãŒãªã³ã°: ãã€ã¯ãã¢ãŒããã¯ãã£ãªãœãŒã¹(ãã£ãã·ã¥ãã¡ã¢ãªåž¯åå¹
)ã®å¹²æžèªèã¹ã±ãžã¥ãŒãªã³ã°ã®çµ±å
- æ§èœããŒã¹èª²é: ãªãœãŒã¹äœ¿çšéã§ã¯ãªãSLOæºè¶³ã«åºã¥ã課éã¢ãã«
- åçŽã¹ã±ãŒãªã³ã°: CPUå¶éã®ãªãç°å¢ã§ã®åçŽã¹ã±ãŒãªã³ã°æé©å
- 倿¬¡å
æé©å: Pod ã¹ã±ãŒãªã³ã°ãšããŒãã¹ã±ãŒãªã³ã°ã®å
±åæé©å
- ç Žå£ç芳ç¹: é åå
ã®åºæ¬çä»®å®ã«ææŠããåæ°ãæã¡ãéèŠãªåŠè¡ç䟡å€ãæãã
- å®èšŒãå
å: çè«åæãå®éšæ€èšŒãæ¥ç調æ»ã®å€æ¬¡å
çæ¯æŽã«ãã芳ç¹ãæ¯æãã
- å®çšç䟡å€: å
·äœçãªä»£æ¿æ¡ãšãããã¿ã€ãå®è£
ãæäŸããçŽæ¥çãªå¿çšäŸ¡å€ãæãã
- äœç³»çåæ: æ§èœãã³ã¹ããä¿¡é Œæ§ãªã©è€æ°ã®èгç¹ããåé¡ãå
æ¬çã«åæãã
- ãã©ã³ã¹ã®åãã芳ç¹: CPUå¶éã®æ¿«çšãæ¹å€ããäžæ¹ã§ããã®åççãªäœ¿çšã±ãŒã¹ãææãã
- å®éšã®éç: å®éšã¯äž»ã«2ã€ã®ãã€ã¯ããµãŒãã¹ã¢ããªã±ãŒã·ã§ã³ã«åºã¥ããŠãããããåºç¯ãªã¢ããªã±ãŒã·ã§ã³ã¿ã€ãã®æ€èšŒãäžè¶³ããŠãã
- æ¬çªæ€èšŒ: å€§èŠæš¡æ¬çªç°å¢ã§ã®é·ææ€èšŒããŒã¿ãäžè¶³ããŠãã
- äºææ§: æ¢åã·ã¹ãã ãšããŒã«ãã§ãŒã³ã®æ¹é ã³ã¹ãã®åæãäžåå
- ã»ãã¥ãªãã£èæ
®: CPUå¶éåé€ãããããå¯èœæ§ã®ããã»ãã¥ãªãã£ãªã¹ã¯ã«ã€ããŠã®è°è«ãäžåå
åŠè¡ç圱é¿:
- ãªãœãŒã¹ç®¡çåéã®ãã©ãã€ã ã·ãããåŒãèµ·ããå¯èœæ§ããã
- èªåã¹ã±ãŒãªã³ã°ç ç©¶ã«æ°ããèšèšææ³ãæäŸãã
- 10幎以äžç¶ãæ¥çãã¹ããã©ã¯ãã£ã¹ã«ææŠãã
æ¥çãžã®åœ±é¿:
- ã¯ã©ãŠããµãŒãã¹ãããã€ãã«ã³ã¹ãæé©åã®æ°ããéãæäŸãã
- Kubernetesãªã©ã®ãªãŒã±ã¹ãã¬ãŒã¿ã®å°æ¥èšèšã«åœ±é¿ãäžããå¯èœæ§ããã
- ããã©ãŒãã³ã¹ããŒã¹èª²éã¢ãã«ã®ã€ãããŒã·ã§ã³ãæšé²ãã
çŽæ¥é©çšå¯èœ:
- ã¬ã€ãã³ã·ææåãªã³ã©ã€ã³ãµãŒãã¹
- ã³ã¹ãææåã¯ã©ãŠããã€ãã£ãã¢ããªã±ãŒã·ã§ã³
- 髿§èœä¿èšŒãå¿
èŠãªãã€ã¯ããµãŒãã¹ã¢ãŒããã¯ãã£
æ
éã«æ€èšãå¿
èŠ:
- ãã«ãããã³ãç°å¢(远å ã®åé¢ã¡ã«ããºã ãå¿
èŠ)
- ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãå«ãæ··åã¯ãŒã¯ããŒã
- ãªãœãŒã¹äœ¿çšã«å³å¯ãªã³ã³ãã©ã€ã¢ã³ã¹èŠä»¶ãããå Žå
è«æã¯83ã®é¢é£æç®ãåŒçšããŠãããã³ã³ãããªãŒã±ã¹ãã¬ãŒã·ã§ã³ããªãœãŒã¹ç®¡çãèªåã¹ã±ãŒãªã³ã°ãªã©è€æ°ã®åéã®éèŠãªç ç©¶ãã«ããŒããŠãããäž»èŠãªåèæç®ã«ã¯ä»¥äžãå«ãŸãã:
- Kuberneteså
¬åŒããã¥ã¡ã³ããšãã¹ããã©ã¯ãã£ã¹
- æè¿ã®ããããã£ã¢äŒè°ã®èªåã¹ã±ãŒãªã³ã°ç ç©¶(OSDI, NSDI, EuroSysãªã©)
- Linuxã«ãŒãã«ã®ã¹ã±ãžã¥ãŒãªã³ã°ãšå¶åŸ¡ã°ã«ãŒãé¢é£ããã¥ã¡ã³ã
- æ¥çå®è·µãšäºäŸç ç©¶
æ¬è«æã¯ããã®ç Žå£çãªèгç¹ãšå
åãªå®èšŒåæã«ãããã¯ã©ãŠããã€ãã£ããªãœãŒã¹ç®¡çåéã«éèŠãªææŠãæèµ·ããŠãããCPUå¶éã®å®å
šãªåé€ã¯ãšã³ã·ã¹ãã ã®åºç¯ãªå€é©ãå¿
èŠãšããå¯èœæ§ãããããæäŸãããæŽå¯ãšä»£æ¿æ¡ã¯åœè©²åéã®å°æ¥ã®çºå±ã«æ°ããæ¹åæ§ã瀺ããŠãããè«æã®äŸ¡å€ã¯æè¡çè²¢ç®ã ãã§ãªããæ¥çã®æ¢å®èŠ³å¿µã«å¯Ÿããæ·±ãåæã«ããã