{"id":366,"date":"2025-09-05T13:54:21","date_gmt":"2025-09-05T05:54:21","guid":{"rendered":"https:\/\/zhaoyanqi.cn\/?p=366"},"modified":"2025-09-10T09:52:45","modified_gmt":"2025-09-10T01:52:45","slug":"pod%e9%87%8c%e9%9d%a2%e6%9f%a5%e8%af%a2cpu%e5%92%8c%e5%86%85%e5%ad%98%e7%9a%84limit%e5%8d%a0%e6%af%94","status":"publish","type":"post","link":"https:\/\/zhaoyanqi.cn\/?p=366","title":{"rendered":"pod\u91cc\u9762\u67e5\u8be2cpu\u548c\u5185\u5b58\u7684limit\u5360\u6bd4"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">CPU\u811a\u672c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\nT=${1:-5}\n\n# \u8ba1\u7b97\u5f53\u524d\u4f7f\u7528 (m)\nget_usage_m() {\n  if &#91; -f \/sys\/fs\/cgroup\/cpu.stat ]; then\n    u1=$(awk '\/^usage_usec\/{print $2}' \/sys\/fs\/cgroup\/cpu.stat)\n    sleep \"$T\"\n    u2=$(awk '\/^usage_usec\/{print $2}' \/sys\/fs\/cgroup\/cpu.stat)\n    du=$((u2-u1))\n    awk -v du=\"$du\" -v t=\"$T\" 'BEGIN{printf \"%.0f\", du\/(t*1000)}'\n  else\n    u1=$(cat \/sys\/fs\/cgroup\/cpu\/cpuacct.usage)\n    sleep \"$T\"\n    u2=$(cat \/sys\/fs\/cgroup\/cpu\/cpuacct.usage)\n    du=$((u2-u1))\n    awk -v du=\"$du\" -v t=\"$T\" 'BEGIN{printf \"%.0f\", du\/(t*1000000)}'\n  fi\n}\n\n# \u8bfb\u53d6 limit (m)\nget_limit_m() {\n  if &#91; -f \/sys\/fs\/cgroup\/cpu.max ]; then\n    read q p &lt; \/sys\/fs\/cgroup\/cpu.max\n    if &#91; \"$q\" = \"max\" ]; then echo 0; else awk -v q=\"$q\" -v p=\"$p\" 'BEGIN{printf \"%.0f\", 1000*q\/p}'; fi\n  elif &#91; -f \/sys\/fs\/cgroup\/cpu\/cpu.cfs_quota_us ]; then\n    q=$(cat \/sys\/fs\/cgroup\/cpu\/cpu.cfs_quota_us)\n    p=$(cat \/sys\/fs\/cgroup\/cpu\/cpu.cfs_period_us)\n    if &#91; \"$q\" -lt 0 ]; then echo 0; else awk -v q=\"$q\" -v p=\"$p\" 'BEGIN{printf \"%.0f\", 1000*q\/p}'; fi\n  else\n    echo 0\n  fi\n}\n\nusage_m=$(get_usage_m)\nlimit_m=$(get_limit_m)\n\nif &#91; \"$limit_m\" -gt 0 ]; then\n  pct=$(awk -v u=\"$usage_m\" -v l=\"$limit_m\" 'BEGIN{printf \"%.1f\", (u\/l)*100}')\n  echo \"CPU: ${usage_m}m \/ limit ${limit_m}m (${pct}%) over ${T}s\"\nelse\n  echo \"CPU: ${usage_m}m (no CPU limit) over ${T}s\"\nfi\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u5185\u5b58\u811a\u672c<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env bash\nset -euo pipefail\n\nto_mib() { awk -v b=\"$1\" 'BEGIN{printf \"%.1f\", b\/1024\/1024}'; }\n\n# \u4e3b\u673a\u603b\u5185\u5b58\uff08\u6574\u6570\uff0c\u5b57\u8282\uff09\nHOST_MEM_KB=$(awk '\/^MemTotal:\/ {print $2}' \/proc\/meminfo 2&gt;\/dev\/null || echo 0)\nHOST_MEM_BYTES=$(( HOST_MEM_KB * 1024 ))\n\n# cgroup v2 ?\nif &#91; -f \/sys\/fs\/cgroup\/cgroup.controllers ]; then\n  USAGE=$(cat \/sys\/fs\/cgroup\/memory.current)\n  INACTIVE=$(awk '\/^inactive_file \/{print $2}' \/sys\/fs\/cgroup\/memory.stat 2&gt;\/dev\/null || echo 0)\n  RAW=$(cat \/sys\/fs\/cgroup\/memory.max)\n  if &#91; \"$RAW\" = \"max\" ]; then\n    MEM_LIMIT=0\n    NO_HARD_LIMIT=1\n  else\n    MEM_LIMIT=$RAW\n    NO_HARD_LIMIT=0\n  fi\nelse\n  # cgroup v1\n  USAGE=$(cat \/sys\/fs\/cgroup\/memory\/memory.usage_in_bytes)\n  INACTIVE=$(awk '\/^total_inactive_file|^inactive_file\/ {v=$2} END{print (v==\"\")?0:v}' \/sys\/fs\/cgroup\/memory\/memory.stat 2&gt;\/dev\/null || echo 0)\n  MEM_LIMIT=$(cat \/sys\/fs\/cgroup\/memory\/memory.limit_in_bytes)\n  NO_HARD_LIMIT=0\n  # \u672a\u8bbe\u9650\u5e38\u89c1\u73b0\u8c61\uff1alimit\u2248\u4e3b\u673a\u5185\u5b58 \u6216 64\u4f4d\u5de8\u5927\u54e8\u5175\u503c\n  if &#91; \"$HOST_MEM_BYTES\" -gt 0 ]; then\n    diff=$(( MEM_LIMIT - HOST_MEM_BYTES ))\n    &#91; $diff -lt 0 ] &amp;&amp; diff=$(( -diff ))\n    if &#91; $diff -lt $((1024*1024)) ]; then\n      NO_HARD_LIMIT=1\n    fi\n  fi\n  if &#91; \"$MEM_LIMIT\" -ge 9223372036850000000 ] 2&gt;\/dev\/null; then\n    NO_HARD_LIMIT=1\n  fi\nfi\n\nWS=$(( USAGE - INACTIVE ))\n&#91; \"$WS\" -lt 0 ] &amp;&amp; WS=0\n\nU_MIB=$(to_mib \"$USAGE\")\nWS_MIB=$(to_mib \"$WS\")\n\nif &#91; \"${NO_HARD_LIMIT:-0}\" -eq 1 ] || &#91; \"${MEM_LIMIT:-0}\" -le 0 ]; then\n  echo \"Memory: usage=${U_MIB}MiB, working_set=${WS_MIB}MiB, limit=no hard limit\"\nelse\n  L_MIB=$(to_mib \"$MEM_LIMIT\")\n  PCT_U=$(awk -v u=\"$USAGE\" -v l=\"$MEM_LIMIT\" 'BEGIN{printf \"%.1f\", (u\/l)*100}')\n  PCT_WS=$(awk -v w=\"$WS\" -v l=\"$MEM_LIMIT\" 'BEGIN{printf \"%.1f\", (w\/l)*100}')\n  echo \"Memory: usage=${U_MIB}MiB (${PCT_U}%)  |  working_set=${WS_MIB}MiB (${PCT_WS}%)  |  limit=${L_MIB}MiB\"\nfi\n<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>CPU\u811a\u672c \u5185\u5b58\u811a\u672c<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[],"class_list":["post-366","post","type-post","status-publish","format-standard","hentry","category-k8s"],"_links":{"self":[{"href":"https:\/\/zhaoyanqi.cn\/index.php?rest_route=\/wp\/v2\/posts\/366","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zhaoyanqi.cn\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zhaoyanqi.cn\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zhaoyanqi.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zhaoyanqi.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=366"}],"version-history":[{"count":2,"href":"https:\/\/zhaoyanqi.cn\/index.php?rest_route=\/wp\/v2\/posts\/366\/revisions"}],"predecessor-version":[{"id":370,"href":"https:\/\/zhaoyanqi.cn\/index.php?rest_route=\/wp\/v2\/posts\/366\/revisions\/370"}],"wp:attachment":[{"href":"https:\/\/zhaoyanqi.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=366"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zhaoyanqi.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=366"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zhaoyanqi.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=366"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}