{"id":329,"date":"2026-07-12T18:55:50","date_gmt":"2026-07-12T10:55:50","guid":{"rendered":"https:\/\/www.mooloco.com\/?p=329"},"modified":"2026-07-12T18:55:51","modified_gmt":"2026-07-12T10:55:51","slug":"cpu%e8%b0%83%e5%ba%a6%e5%99%a8%e5%8e%9f%e7%90%86%e4%b8%8elinux-cfs-%e8%99%9a%e6%8b%9f%e6%9c%ba%e8%b0%83%e5%ba%a6%e8%af%a6%e8%a7%a3","status":"publish","type":"post","link":"https:\/\/www.mooloco.com\/?p=329","title":{"rendered":"CPU\u8c03\u5ea6\u5668\u539f\u7406\u4e0eLinux CFS \u865a\u62df\u673a\u8c03\u5ea6\u8be6\u89e3"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_75 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.mooloco.com\/?p=329\/#1_CPU_%E8%B0%83%E5%BA%A6%E5%99%A8%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5\" >1. CPU \u8c03\u5ea6\u5668\u57fa\u7840\u6982\u5ff5<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.mooloco.com\/?p=329\/#2_Linux_%E8%B0%83%E5%BA%A6%E5%99%A8%E6%9E%B6%E6%9E%84%E6%BC%94%E8%BF%9B\" >2. Linux \u8c03\u5ea6\u5668\u67b6\u6784\u6f14\u8fdb<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.mooloco.com\/?p=329\/#3_CFS_%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86\" >3. CFS \u6838\u5fc3\u539f\u7406<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.mooloco.com\/?p=329\/#31_%E8%99%9A%E6%8B%9F%E8%BF%90%E8%A1%8C%E6%97%B6%E9%97%B4%EF%BC%88vruntime%EF%BC%89\" >3.1 \u865a\u62df\u8fd0\u884c\u65f6\u95f4\uff08vruntime\uff09<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.mooloco.com\/?p=329\/#32_%E7%BA%A2%E9%BB%91%E6%A0%91%EF%BC%88Red-Black_Tree%EF%BC%89\" >3.2 \u7ea2\u9ed1\u6811\uff08Red-Black Tree\uff09<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.mooloco.com\/?p=329\/#33_%E8%B0%83%E5%BA%A6%E5%91%A8%E6%9C%9F%E4%B8%8E%E6%9C%80%E5%B0%8F%E7%B2%92%E5%BA%A6\" >3.3 \u8c03\u5ea6\u5468\u671f\u4e0e\u6700\u5c0f\u7c92\u5ea6<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.mooloco.com\/?p=329\/#34_%E6%8A%A2%E5%8D%A0%E6%97%B6%E6%9C%BA\" >3.4 \u62a2\u5360\u65f6\u673a<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.mooloco.com\/?p=329\/#35_%E7%9D%A1%E7%9C%A0%E8%A1%A5%E5%81%BF\" >3.5 \u7761\u7720\u8865\u507f<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.mooloco.com\/?p=329\/#4_%E8%B0%83%E5%BA%A6%E7%B1%BB%E4%B8%8E%E4%BC%98%E5%85%88%E7%BA%A7%E4%BD%93%E7%B3%BB\" >4. \u8c03\u5ea6\u7c7b\u4e0e\u4f18\u5148\u7ea7\u4f53\u7cfb<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.mooloco.com\/?p=329\/#5_%E7%BB%84%E8%B0%83%E5%BA%A6%EF%BC%88cgroup%EF%BC%89%E6%9C%BA%E5%88%B6\" >5. \u7ec4\u8c03\u5ea6\uff08cgroup\uff09\u673a\u5236<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.mooloco.com\/?p=329\/#6_KVM_%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%9A%84%E8%B0%83%E5%BA%A6%E6%A8%A1%E5%9E%8B\" >6. KVM \u865a\u62df\u673a\u7684\u8c03\u5ea6\u6a21\u578b<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.mooloco.com\/?p=329\/#7_CFS_%E5%A6%82%E4%BD%95%E8%B0%83%E5%BA%A6_vCPU_%E7%BA%BF%E7%A8%8B\" >7. CFS \u5982\u4f55\u8c03\u5ea6 vCPU \u7ebf\u7a0b<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.mooloco.com\/?p=329\/#71_%E5%8A%A0%E5%85%A5%E8%BF%90%E8%A1%8C%E9%98%9F%E5%88%97%E4%B8%8E_vruntime_%E7%AB%9E%E4%BA%89\" >7.1 \u52a0\u5165\u8fd0\u884c\u961f\u5217\u4e0e vruntime \u7ade\u4e89<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.mooloco.com\/?p=329\/#72_%E5%94%A4%E9%86%92%E6%8A%A2%E5%8D%A0%E4%B8%8E%E4%B8%AD%E6%96%AD%E5%93%8D%E5%BA%94%E5%BB%B6%E8%BF%9F\" >7.2 \u5524\u9192\u62a2\u5360\u4e0e\u4e2d\u65ad\u54cd\u5e94\u5ef6\u8fdf<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.mooloco.com\/?p=329\/#73_%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E4%B8%8E_NUMA_%E6%84%9F%E7%9F%A5\" >7.3 \u8d1f\u8f7d\u5747\u8861\u4e0e NUMA \u611f\u77e5<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.mooloco.com\/?p=329\/#8_%E8%99%9A%E6%8B%9F%E5%8C%96%E5%9C%BA%E6%99%AF%E4%B8%8B%E7%9A%84%E7%89%B9%E6%AE%8A%E8%B0%83%E5%BA%A6%E9%97%AE%E9%A2%98\" >8. \u865a\u62df\u5316\u573a\u666f\u4e0b\u7684\u7279\u6b8a\u8c03\u5ea6\u95ee\u9898<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.mooloco.com\/?p=329\/#81_vCPU_Stealing_Time%EF%BC%88%E8%A2%AB%E7%AA%83%E5%8F%96%E6%97%B6%E9%97%B4%EF%BC%89\" >8.1 vCPU Stealing Time\uff08\u88ab\u7a83\u53d6\u65f6\u95f4\uff09<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/www.mooloco.com\/?p=329\/#82_Double_Scheduling%EF%BC%88%E5%8F%8C%E9%87%8D%E8%B0%83%E5%BA%A6%EF%BC%89%E9%97%AE%E9%A2%98\" >8.2 Double Scheduling\uff08\u53cc\u91cd\u8c03\u5ea6\uff09\u95ee\u9898<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/www.mooloco.com\/?p=329\/#83_SCHED_FIFO_SCHED_DEADLINE_%E7%94%A8%E4%BA%8E_vCPU_%E7%BA%BF%E7%A8%8B\" >8.3 SCHED_FIFO \/ SCHED_DEADLINE \u7528\u4e8e vCPU \u7ebf\u7a0b<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/www.mooloco.com\/?p=329\/#9_%E8%99%9A%E6%8B%9F%E6%9C%BA_CPU_%E8%B5%84%E6%BA%90%E9%99%90%E5%88%B6%E4%B8%8E%E9%9A%94%E7%A6%BB\" >9. \u865a\u62df\u673a CPU \u8d44\u6e90\u9650\u5236\u4e0e\u9694\u79bb<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/www.mooloco.com\/?p=329\/#10_%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98%E5%AE%9E%E8%B7%B5\" >10. \u6027\u80fd\u8c03\u4f18\u5b9e\u8df5<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/www.mooloco.com\/?p=329\/#11_%E8%A7%82%E6%B5%8B%E4%B8%8E%E8%B0%83%E8%AF%95%E5%B7%A5%E5%85%B7\" >11. \u89c2\u6d4b\u4e0e\u8c03\u8bd5\u5de5\u5177<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/www.mooloco.com\/?p=329\/#12_EEVDF%EF%BC%9ACFS_%E7%9A%84%E7%BB%A7%E4%BB%BB%E8%80%85\" >12. EEVDF\uff1aCFS \u7684\u7ee7\u4efb\u8005<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/www.mooloco.com\/?p=329\/#%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99%E6%96%B9%E5%90%91%EF%BC%88%E4%BE%9B%E8%BF%9B%E4%B8%80%E6%AD%A5%E6%9F%A5%E9%98%85%EF%BC%89\" >\u53c2\u8003\u8d44\u6599\u65b9\u5411\uff08\u4f9b\u8fdb\u4e00\u6b65\u67e5\u9605\uff09<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_CPU_%E8%B0%83%E5%BA%A6%E5%99%A8%E5%9F%BA%E7%A1%80%E6%A6%82%E5%BF%B5\"><\/span>1. CPU \u8c03\u5ea6\u5668\u57fa\u7840\u6982\u5ff5<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">CPU \u8c03\u5ea6\u5668\uff08Scheduler\uff09\u662f\u64cd\u4f5c\u7cfb\u7edf\u5185\u6838\u7684\u6838\u5fc3\u7ec4\u4ef6\uff0c\u8d1f\u8d23\u51b3\u5b9a&#8221;\u54ea\u4e2a\u53ef\u8fd0\u884c\u4efb\u52a1\u5728\u54ea\u4e2a CPU \u6838\u5fc3\u4e0a\u8fd0\u884c\u591a\u4e45&#8221;\u3002\u5176\u76ee\u6807\u901a\u5e38\u5305\u62ec\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u516c\u5e73\u6027\uff08Fairness\uff09<\/strong>\uff1a\u6bcf\u4e2a\u4efb\u52a1\u90fd\u80fd\u83b7\u5f97\u4e0e\u5176\u6743\u91cd\u76f8\u79f0\u7684 CPU \u65f6\u95f4\u3002<\/li>\n\n\n\n<li><strong>\u541e\u5410\u91cf\uff08Throughput\uff09<\/strong>\uff1a\u5355\u4f4d\u65f6\u95f4\u5185\u5b8c\u6210\u5c3d\u53ef\u80fd\u591a\u7684\u5de5\u4f5c\u3002<\/li>\n\n\n\n<li><strong>\u54cd\u5e94\u5ef6\u8fdf\uff08Latency\uff09<\/strong>\uff1a\u4ea4\u4e92\u5f0f\u4efb\u52a1\u5e94\u5c3d\u5feb\u83b7\u5f97\u54cd\u5e94\u3002<\/li>\n\n\n\n<li><strong>CPU \u5229\u7528\u7387<\/strong>\uff1a\u5c3d\u91cf\u51cf\u5c11 CPU \u7a7a\u95f2\u3002<\/li>\n\n\n\n<li><strong>\u53ef\u6269\u5c55\u6027<\/strong>\uff1a\u5728\u591a\u6838\u3001\u591a\u8def\uff08NUMA\uff09\u7cfb\u7edf\u4e0a\u4ecd\u4fdd\u6301\u9ad8\u6548\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u4e9b\u76ee\u6807\u5f7c\u6b64\u51b2\u7a81\u2014\u2014\u516c\u5e73\u6027\u53ef\u80fd\u727a\u7272\u541e\u5410\u91cf\uff0c\u4f4e\u5ef6\u8fdf\u53ef\u80fd\u727a\u7272\u6574\u4f53\u6548\u7387\uff0c\u8c03\u5ea6\u5668\u8bbe\u8ba1\u7684\u672c\u8d28\u5c31\u662f\u5728\u8fd9\u4e9b\u76ee\u6807\u4e4b\u95f4\u505a\u6743\u8861\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u8c03\u5ea6\u5668\u9762\u5bf9\u7684\u4efb\u52a1\u901a\u5e38\u5206\u4e3a\u4e24\u7c7b\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CPU \u5bc6\u96c6\u578b\uff08CPU-bound\uff09<\/strong>\uff1a\u5982\u79d1\u5b66\u8ba1\u7b97\u3001\u7f16\u8bd1\uff0c\u503e\u5411\u4e8e\u957f\u65f6\u95f4\u5360\u7528 CPU\u3002<\/li>\n\n\n\n<li><strong>I\/O \u5bc6\u96c6\u578b \/ \u4ea4\u4e92\u5f0f\uff08I\/O-bound\uff09<\/strong>\uff1a\u5982 shell\u3001GUI\u3001\u7f51\u7edc\u670d\u52a1\uff0c\u9891\u7e41\u7761\u7720\u7b49\u5f85 I\/O\uff0c\u4e00\u65e6\u88ab\u5524\u9192\u5e0c\u671b\u80fd\u7acb\u523b\u62a2\u5360\u6267\u884c\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u865a\u62df\u673a\u7684 vCPU \u7ebf\u7a0b\u6bd4\u8f83\u7279\u6b8a\uff1a\u5b83\u5bf9\u5bbf\u4e3b\u673a\u800c\u8a00\u770b\u8d77\u6765\u50cf\u4e00\u4e2a CPU \u5bc6\u96c6\u578b\u4efb\u52a1\uff08\u865a\u62df\u673a\u5185\u90e8\u4e00\u76f4\u5728&#8221;\u8dd1&#8221;\u4e1c\u897f\uff09\uff0c\u4f46\u5176\u5185\u90e8\u5b9e\u9645\u4e0a\u6df7\u5408\u4e86\u5927\u91cf\u7684\u7a7a\u95f2\u7b49\u5f85\uff08vCPU \u6267\u884c <code>HLT<\/code>\/<code>MWAIT<\/code> \u8ba9\u51fa\u7269\u7406 CPU\uff09\u548c\u7a81\u53d1\u8ba1\u7b97\uff0c\u8fd9\u4e5f\u662f\u672c\u6587\u540e\u534a\u90e8\u5206\u8981\u91cd\u70b9\u8ba8\u8bba\u7684\u5730\u65b9\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_Linux_%E8%B0%83%E5%BA%A6%E5%99%A8%E6%9E%B6%E6%9E%84%E6%BC%94%E8%BF%9B\"><\/span>2. Linux \u8c03\u5ea6\u5668\u67b6\u6784\u6f14\u8fdb<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u9636\u6bb5<\/th><th>\u8c03\u5ea6\u5668<\/th><th>\u65f6\u95f4\u590d\u6742\u5ea6<\/th><th>\u4e3b\u8981\u95ee\u9898<\/th><\/tr><\/thead><tbody><tr><td>2.4 \u53ca\u4ee5\u524d<\/td><td>\u7b80\u5355\u8f6e\u8be2\u8c03\u5ea6\u5668<\/td><td>O(n)<\/td><td>\u6bcf\u6b21\u9009\u4efb\u52a1\u8981\u904d\u5386\u6240\u6709\u4efb\u52a1\uff0c\u591a\u6838\/\u591a\u4efb\u52a1\u4e0b\u6027\u80fd\u5dee<\/td><\/tr><tr><td>2.6.0 ~ 2.6.22<\/td><td>O(1) \u8c03\u5ea6\u5668\uff08Ingo Molnar\uff09<\/td><td>O(1)<\/td><td>\u7528\u4f18\u5148\u7ea7\u6570\u7ec4\u5b9e\u73b0\u5e38\u6570\u65f6\u95f4\u9009\u4efb\u52a1\uff0c\u4f46<strong>\u4ea4\u4e92\u5f0f\u4efb\u52a1\u8bc6\u522b\u542f\u53d1\u5f0f<\/strong>\u590d\u6742\u4e14\u7ecf\u5e38\u5224\u65ad\u5931\u8bef<\/td><\/tr><tr><td>2.6.23 \u81f3\u4eca<\/td><td><strong>CFS\uff08Completely Fair Scheduler\uff09<\/strong><\/td><td>O(log n)<\/td><td>\u5f7b\u5e95\u629b\u5f03&#8221;\u65f6\u95f4\u7247&#8221;\u6982\u5ff5\uff0c\u7528\u7ea2\u9ed1\u6811 + \u865a\u62df\u8fd0\u884c\u65f6\u95f4\u5b9e\u73b0&#8221;\u5b8c\u5168\u516c\u5e73&#8221;<\/td><\/tr><tr><td>6.6+\uff082023 \u5e95\u5f15\u5165\uff0c\u9010\u6b65\u9ed8\u8ba4\u5316\uff09<\/td><td><strong>EEVDF<\/strong>\uff08Earliest Eligible Virtual Deadline First\uff09<\/td><td>O(log n)<\/td><td>\u89e3\u51b3 CFS \u5728\u7b49\u5f85\/\u5ef6\u8fdf\u4fdd\u8bc1\u4e0a\u7684\u7406\u8bba\u7f3a\u9677<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">CFS \u7531 Ingo Molnar \u5728 2007 \u5e74\u63d0\u51fa\uff0c\u5176\u8bbe\u8ba1\u54f2\u5b66\u53d7\u5230&#8221;\u7406\u60f3\u7684\u3001\u7cbe\u786e\u7684\u591a\u4efb\u52a1 CPU&#8221;\uff08ideal multitasking CPU\uff09\u6a21\u578b\u542f\u53d1\uff1a\u5047\u8bbe\u6709\u4e00\u4e2a\u7406\u60f3\u5904\u7406\u5668\u53ef\u4ee5\u8ba9 N \u4e2a\u4efb\u52a1\u540c\u65f6\u4ee5 1\/N \u7684\u901f\u5ea6\u5e76\u884c\u6267\u884c\uff0cCFS \u7684\u76ee\u6807\u5c31\u662f\u7528\u73b0\u5b9e\u4e2d\u53ea\u80fd\u4e32\u884c\u6267\u884c\u7684\u7269\u7406 CPU \u53bb<strong>\u903c\u8fd1<\/strong>\u8fd9\u4e2a\u7406\u60f3\u6a21\u578b\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_CFS_%E6%A0%B8%E5%BF%83%E5%8E%9F%E7%90%86\"><\/span>3. CFS \u6838\u5fc3\u539f\u7406<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"31_%E8%99%9A%E6%8B%9F%E8%BF%90%E8%A1%8C%E6%97%B6%E9%97%B4%EF%BC%88vruntime%EF%BC%89\"><\/span>3.1 \u865a\u62df\u8fd0\u884c\u65f6\u95f4\uff08vruntime\uff09<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">CFS \u4e0d\u518d\u4f7f\u7528\u56fa\u5b9a\u65f6\u95f4\u7247\u8f6e\u8f6c\uff0c\u800c\u662f\u4e3a\u6bcf\u4e2a\u53ef\u8fd0\u884c\u4efb\u52a1\u7ef4\u62a4\u4e00\u4e2a <code>vruntime<\/code>\uff08\u865a\u62df\u8fd0\u884c\u65f6\u95f4\uff09\u3002\u6838\u5fc3\u601d\u60f3\uff1a<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>\u8c01\u7684 vruntime \u6700\u5c0f\uff0c\u8c01\u5c31\u6700\u5e94\u8be5\u88ab\u8c03\u5ea6\u3002<\/strong><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">vruntime \u7684\u589e\u957f\u901f\u5ea6\u4e0e\u4efb\u52a1\u7684\u6743\u91cd\uff08\u7531 nice \u503c\u51b3\u5b9a\uff09\u6210\u53cd\u6bd4\uff1a<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nvruntime += \u5b9e\u9645\u8fd0\u884c\u65f6\u95f4 \u00d7 (NICE_0_WEIGHT \/ \u4efb\u52a1\u6743\u91cd)\n\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\">\n<li>nice \u503c\u8d8a\u4f4e\uff08\u4f18\u5148\u7ea7\u8d8a\u9ad8\uff0c\u5982 -20\uff09\uff0c\u6743\u91cd\u8d8a\u5927\uff0cvruntime \u589e\u957f\u8d8a\u6162\uff0c\u56e0\u6b64\u80fd\u83b7\u5f97\u66f4\u591a\u5b9e\u9645 CPU \u65f6\u95f4\u3002<\/li>\n\n\n\n<li>nice \u503c\u8d8a\u9ad8\uff08\u4f18\u5148\u7ea7\u8d8a\u4f4e\uff0c\u5982 19\uff09\uff0c\u6743\u91cd\u8d8a\u5c0f\uff0cvruntime \u589e\u957f\u8d8a\u5feb\uff0c\u8d8a\u5bb9\u6613\u88ab\u5176\u4ed6\u4efb\u52a1\u8d85\u8fc7\u3001\u8ba9\u51fa CPU\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5185\u6838\u7528\u4e00\u5f20 <code>nice_to_weight<\/code> \u8868\u5c06 -20~19 \u7684 nice \u503c\u6620\u5c04\u4e3a\u6743\u91cd\uff08nice=0 \u65f6\u6743\u91cd\u4e3a 1024\uff0cnice \u6bcf +1\uff0c\u5927\u7ea6\u8870\u51cf 10%\uff09\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"32_%E7%BA%A2%E9%BB%91%E6%A0%91%EF%BC%88Red-Black_Tree%EF%BC%89\"><\/span>3.2 \u7ea2\u9ed1\u6811\uff08Red-Black Tree\uff09<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">CFS \u7528\u4e00\u68f5\u6309 vruntime \u6392\u5e8f\u7684\u7ea2\u9ed1\u6811\uff08<code>cfs_rq-&gt;tasks_timeline<\/code>\uff09\u7ba1\u7406\u6240\u6709\u53ef\u8fd0\u884c\u4efb\u52a1\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6811\u7684\u6700\u5de6\u8282\u70b9\uff08<code>leftmost<\/code>\uff09\u6c38\u8fdc\u662f vruntime \u6700\u5c0f\u7684\u4efb\u52a1\uff0c\u4e5f\u5c31\u662f\u4e0b\u4e00\u4e2a\u8be5\u88ab\u8c03\u5ea6\u7684\u4efb\u52a1\uff0c\u9009\u62e9\u590d\u6742\u5ea6\u4e3a **O(1)**\uff08\u6709\u7f13\u5b58\u6307\u9488\uff09\u3002<\/li>\n\n\n\n<li>\u4efb\u52a1\u5165\u961f\/\u51fa\u961f\uff08\u63d2\u5165\/\u5220\u9664\u8282\u70b9\uff09\u590d\u6742\u5ea6\u4e3a **O(log n)**\u3002<\/li>\n\n\n\n<li>\u6b63\u5728\u8fd0\u884c\u7684\u4efb\u52a1\u4e0d\u5728\u6811\u4e2d\uff0c\u88ab\u62a2\u5360\u540e\u4f1a\u91cd\u65b0\u63d2\u5165\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u79cd\u7ed3\u6784\u5929\u7136\u5b9e\u73b0\u4e86\u516c\u5e73\u6027\uff1a\u4e00\u4e2a\u4efb\u52a1\u8fd0\u884c\u5f97\u8d8a\u591a\uff0cvruntime \u8d8a\u5927\uff0c\u5c31\u4f1a\u88ab\u6392\u5230\u6811\u7684\u53f3\u4fa7\uff0c\u8ba9\u4f4d\u7ed9 vruntime \u66f4\u5c0f\uff08\u8fd0\u884c\u5f97\u5c11\uff09\u7684\u4efb\u52a1\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"33_%E8%B0%83%E5%BA%A6%E5%91%A8%E6%9C%9F%E4%B8%8E%E6%9C%80%E5%B0%8F%E7%B2%92%E5%BA%A6\"><\/span>3.3 \u8c03\u5ea6\u5468\u671f\u4e0e\u6700\u5c0f\u7c92\u5ea6<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">CFS \u901a\u8fc7\u4e24\u4e2a\u53c2\u6570\u63a7\u5236&#8221;\u516c\u5e73&#8221;\u4e0e&#8221;\u5207\u6362\u5f00\u9500&#8221;\u4e4b\u95f4\u7684\u5e73\u8861\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>sched_latency_ns<\/code>\uff08\u9ed8\u8ba4\u7ea6 24ms\uff0c\u968f\u6838\u6570\u52a8\u6001\u8c03\u6574\uff09\uff1a\u4e00\u4e2a&#8221;\u7406\u60f3\u8c03\u5ea6\u5468\u671f&#8221;\u5185\uff0c\u7cfb\u7edf\u5e94\u5c3d\u91cf\u8ba9\u6240\u6709\u53ef\u8fd0\u884c\u4efb\u52a1\u90fd\u88ab\u8c03\u5ea6\u4e00\u6b21\u3002<\/li>\n\n\n\n<li><code>sched_min_granularity_ns<\/code>\uff08\u9ed8\u8ba4\u7ea6 3ms\uff09\uff1a\u6bcf\u4e2a\u4efb\u52a1\u5728\u4e00\u6b21\u8c03\u5ea6\u5468\u671f\u4e2d\u7684\u6700\u5c0f\u8fd0\u884c\u65f6\u95f4\uff0c\u9632\u6b62\u4efb\u52a1\u8fc7\u591a\u65f6\u6bcf\u4e2a\u4efb\u52a1\u5206\u5230\u7684\u65f6\u95f4\u7247\u8fc7\u77ed\u5bfc\u81f4\u4e0a\u4e0b\u6587\u5207\u6362\u5f00\u9500\u8fc7\u5927\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u5b9e\u9645\u6bcf\u4e2a\u4efb\u52a1\u5206\u914d\u7684\u65f6\u95f4\u7247 = <code>sched_latency_ns \u00d7 (\u81ea\u8eab\u6743\u91cd \/ \u5c31\u7eea\u961f\u5217\u603b\u6743\u91cd)<\/code>\uff0c\u4f46\u4e0d\u4f1a\u4f4e\u4e8e <code>sched_min_granularity_ns<\/code>\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"34_%E6%8A%A2%E5%8D%A0%E6%97%B6%E6%9C%BA\"><\/span>3.4 \u62a2\u5360\u65f6\u673a<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">CFS \u5e76\u4e0d\u4f9d\u8d56\u56fa\u5b9a\u65f6\u949f\u4e2d\u65ad\u505a\u65f6\u95f4\u7247\u8017\u5c3d\u68c0\u67e5\u90a3\u4e48\u7b80\u5355\uff0c\u62a2\u5360\u53d1\u751f\u5728\u4ee5\u4e0b\u573a\u666f\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5468\u671f\u6027 tick<\/strong>\uff1a<code>scheduler_tick()<\/code> \u4e2d\u68c0\u67e5\u5f53\u524d\u4efb\u52a1\u8fd0\u884c\u65f6\u95f4\u662f\u5426\u8d85\u8fc7\u5176\u5e94\u5f97\u7684\u65f6\u95f4\u7247\uff0c\u8d85\u8fc7\u5219\u8bbe\u7f6e <code>TIF_NEED_RESCHED<\/code>\u3002<\/li>\n\n\n\n<li><strong>\u4efb\u52a1\u5524\u9192\uff08wakeup preemption\uff09<\/strong>\uff1a\u65b0\u5524\u9192\u7684\u4efb\u52a1\u5982\u679c vruntime \u660e\u663e\u5c0f\u4e8e\u5f53\u524d\u8fd0\u884c\u4efb\u52a1\uff08\u5dee\u503c\u8d85\u8fc7 <code>sched_wakeup_granularity_ns<\/code>\uff09\uff0c\u4f1a\u62a2\u5360\u5f53\u524d\u4efb\u52a1\u3002\u8fd9\u5bf9<strong>\u4ea4\u4e92\u5f0f\/I\/O \u5bc6\u96c6\u578b\u4efb\u52a1<\/strong>\uff08\u5982 vCPU \u88ab\u4e2d\u65ad\u5524\u9192\uff09\u975e\u5e38\u5173\u952e\u2014\u2014\u5b83\u4eec\u901a\u5e38\u7761\u7720\u4e45\u3001vruntime \u79ef\u7d2f\u5c11\uff0c\u4e00\u65e6\u5524\u9192\u80fd\u5feb\u901f\u62a2\u5230 CPU\u3002<\/li>\n\n\n\n<li><strong>\u4efb\u52a1\u4e3b\u52a8\u8ba9\u51fa<\/strong>\uff1a\u8c03\u7528 <code>sched_yield()<\/code>\u3001\u963b\u585e\u5728\u9501\/I\/O \u4e0a\u7b49\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"35_%E7%9D%A1%E7%9C%A0%E8%A1%A5%E5%81%BF\"><\/span>3.5 \u7761\u7720\u8865\u507f<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4efb\u52a1\u7761\u7720\u65f6\u4e0d\u4f1a\u7d2f\u79ef vruntime\u3002\u4e3a\u907f\u514d\u4efb\u52a1\u7761\u7720\u5f52\u6765\u540e vruntime \u8fc7\u5c0f\u4ece\u800c&#8221;\u9738\u5360&#8221; CPU \u5f88\u957f\u65f6\u95f4\uff0cCFS \u5728\u4efb\u52a1\u88ab\u5524\u9192\u91cd\u65b0\u5165\u961f\u65f6\u4f1a\u505a vruntime \u8865\u507f\uff1a<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n\u65b0 vruntime = max(\u4efb\u52a1\u539f vruntime, cfs_rq-&gt;min_vruntime - \u4e00\u5b9a\u8865\u507f\u91cf)\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u5373\u628a\u521a\u9192\u6765\u7684\u4efb\u52a1\u7684 vruntime \u8c03\u6574\u5230\u63a5\u8fd1\u5f53\u524d\u8fd0\u884c\u961f\u5217\u7684\u6700\u5c0f vruntime\uff0c\u800c\u4e0d\u662f\u65e0\u9650\u8ffd\u5e73\uff0c\u8fd9\u6837\u65e2\u7ed9\u5b83\u4e00\u5b9a\u7684&#8221;\u5524\u9192\u4f18\u5148\u6743&#8221;\uff0c\u53c8\u4e0d\u4f1a\u8ba9\u957f\u671f\u7761\u7720\u7684\u4efb\u52a1\u4e00\u9192\u6765\u5c31\u65e0\u9650\u671f\u62a2\u5360\u5176\u4ed6\u4efb\u52a1\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4_%E8%B0%83%E5%BA%A6%E7%B1%BB%E4%B8%8E%E4%BC%98%E5%85%88%E7%BA%A7%E4%BD%93%E7%B3%BB\"><\/span>4. \u8c03\u5ea6\u7c7b\u4e0e\u4f18\u5148\u7ea7\u4f53\u7cfb<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Linux \u8c03\u5ea6\u5668\u91c7\u7528<strong>\u6a21\u5757\u5316\u7684\u8c03\u5ea6\u7c7b\uff08scheduling class\uff09<\/strong>\u67b6\u6784\uff0c\u6309\u4f18\u5148\u7ea7\u4ece\u9ad8\u5230\u4f4e\u4f9d\u6b21\u5c1d\u8bd5\uff1a<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nstop_sched_class   \u2192 \u7528\u4e8e\u505c\u673a\/\u70ed\u63d2\u62d4\u7b49\u7279\u6b8a\u573a\u666f\uff08\u6700\u9ad8\u4f18\u5148\u7ea7\uff09\n    \u2193\ndl_sched_class     \u2192 SCHED_DEADLINE\uff08EDF\uff0c\u786c\u5b9e\u65f6\uff09\n    \u2193\nrt_sched_class     \u2192 SCHED_FIFO \/ SCHED_RR\uff08\u8f6f\u5b9e\u65f6\uff09\n    \u2193\nfair_sched_class   \u2192 SCHED_NORMAL \/ SCHED_BATCH \/ SCHED_IDLE\uff08\u5373 CFS\uff0c\u7edd\u5927\u591a\u6570\u8fdb\u7a0b\uff09\n    \u2193\nidle_sched_class   \u2192 CPU \u7a7a\u95f2\u65f6\u8fd0\u884c\u7684 idle \u4efb\u52a1\uff08\u6700\u4f4e\u4f18\u5148\u7ea7\uff09\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">\u6838\u5fc3\u8c03\u5ea6\u51fd\u6570 <code>pick_next_task()<\/code> \u4f1a\u6309\u4e0a\u8ff0\u987a\u5e8f\u4f9d\u6b21\u8be2\u95ee\u6bcf\u4e2a\u8c03\u5ea6\u7c7b&#8221;\u4f60\u6709\u6ca1\u6709\u53ef\u8fd0\u884c\u4efb\u52a1&#8221;\uff0c\u4e00\u65e6\u627e\u5230\u5c31\u8fd4\u56de\uff0c\u56e0\u6b64\u5b9e\u65f6\u4efb\u52a1\uff08RT\/Deadline\uff09\u6c38\u8fdc\u4f18\u5148\u4e8e CFS \u7ba1\u7406\u7684\u666e\u901a\u4efb\u52a1\u3002<strong>QEMU\/KVM \u7684 vCPU \u7ebf\u7a0b\u9ed8\u8ba4\u5c5e\u4e8e <code>fair_sched_class<\/code>\uff08CFS \u7ba1\u7406\uff09<\/strong>\uff0c\u4f46\u5728\u9700\u8981\u4f4e\u5ef6\u8fdf\u573a\u666f\u4e0b\u4e5f\u5e38\u88ab\u663e\u5f0f\u914d\u7f6e\u4e3a <code>SCHED_FIFO<\/code> \u6216\u7ed3\u5408 <code>SCHED_DEADLINE<\/code> \u4f7f\u7528\uff08\u89c1\u7b2c 8 \u8282\uff09\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5_%E7%BB%84%E8%B0%83%E5%BA%A6%EF%BC%88cgroup%EF%BC%89%E6%9C%BA%E5%88%B6\"><\/span>5. \u7ec4\u8c03\u5ea6\uff08cgroup\uff09\u673a\u5236<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">CFS \u652f\u6301<strong>\u5c42\u7ea7\u5316\u7684\u7ec4\u8c03\u5ea6\uff08Group Scheduling\uff09<\/strong>\uff0c\u8fd9\u662f\u7406\u89e3\u865a\u62df\u673a\u8c03\u5ea6\u516c\u5e73\u6027\u7684\u5173\u952e\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u6bcf\u4e2a cgroup\uff08\u6216\u5bb9\u5668\uff09\u5728 CFS \u770b\u6765\u4e0d\u662f\u4e00\u5806\u79bb\u6563\u7684\u4efb\u52a1\uff0c\u800c\u662f\u4e00\u4e2a&#8221;\u4efb\u52a1\u7ec4&#8221;\uff0c\u7ec4\u5185\u518d\u6709\u81ea\u5df1\u7684\u4e00\u68f5\u7ea2\u9ed1\u6811\u3002<\/li>\n\n\n\n<li>\u8c03\u5ea6\u51b3\u7b56\u53d8\u6210\u4e24\u5c42\uff1a\u5148\u5728\u9876\u5c42\u9009\u51fa vruntime \u6700\u5c0f\u7684<strong>\u7ec4<\/strong>\uff0c\u518d\u8fdb\u5165\u8be5\u7ec4\u5185\u90e8\u9009\u51fa vruntime \u6700\u5c0f\u7684<strong>\u4efb\u52a1\/\u5b50\u7ec4<\/strong>\u3002<\/li>\n\n\n\n<li>\u8fd9\u4fdd\u8bc1\u4e86<strong>\u7ec4\u95f4\u516c\u5e73<\/strong>\uff1a\u4e00\u4e2a\u5f00\u4e86 100 \u4e2a\u7ebf\u7a0b\u7684 cgroup \u4e0d\u4f1a\u56e0\u4e3a\u7ebf\u7a0b\u591a\u5c31\u62a2\u5230\u66f4\u591a CPU\uff0c\u56e0\u4e3a\u8c03\u5ea6\u5668\u5148\u6309\u7ec4\u5206\u914d\u516c\u5e73\u7684\u4efd\u989d\uff0c\u7ec4\u5185\u90e8\u518d\u5206\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u5bf9\u591a\u865a\u62df\u673a\u5171\u5b58\u7684\u5bbf\u4e3b\u673a\u975e\u5e38\u91cd\u8981\uff1a\u5982\u679c\u6bcf\u4e2a\u865a\u62df\u673a\uff08\u53ca\u5176\u6240\u6709 vCPU \u7ebf\u7a0b\uff09\u88ab\u653e\u5165\u72ec\u7acb\u7684 cgroup\uff08libvirt\/QEMU \u9ed8\u8ba4\u884c\u4e3a\uff09\uff0c\u90a3\u4e48&#8221;\u865a\u62df\u673a A \u5f00 32 \u4e2a vCPU\u3001\u865a\u62df\u673a B \u53ea\u5f00 2 \u4e2a vCPU&#8221;\u4e0d\u4f1a\u5bfc\u81f4 A \u62a2\u8d70\u8fdc\u8d85\u5176\u5e94\u5f97\u4efd\u989d\u7684\u7269\u7406 CPU \u65f6\u95f4\u2014\u2014\u4e24\u53f0\u865a\u62df\u673a\u4ecd\u4f1a\u6309 cgroup \u6743\u91cd\uff08<code>cpu.shares<\/code> \/ <code>cpu.weight<\/code>\uff09\u5927\u81f4\u516c\u5e73\u5206\u914d\uff0c\u7136\u540e\u5404\u81ea\u5185\u90e8\u518d\u53bb\u5206\u914d\u7ed9\u81ea\u5df1\u7684 vCPU \u7ebf\u7a0b\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"6_KVM_%E8%99%9A%E6%8B%9F%E6%9C%BA%E7%9A%84%E8%B0%83%E5%BA%A6%E6%A8%A1%E5%9E%8B\"><\/span>6. KVM \u865a\u62df\u673a\u7684\u8c03\u5ea6\u6a21\u578b<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7406\u89e3&#8221;CFS \u5982\u4f55\u8c03\u5ea6\u865a\u62df\u673a&#8221;\uff0c\u9996\u5148\u8981\u7406\u89e3 KVM \u7684\u7528\u6237\u6001\/\u5185\u6838\u6001\u534f\u4f5c\u6a21\u578b\uff1a<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nQEMU \u8fdb\u7a0b\n \u251c\u2500 vCPU \u7ebf\u7a0b 0  (ioctl KVM_RUN \u2192 \u8fdb\u5165 Guest Mode \u6267\u884c vCPU0 \u6307\u4ee4)\n \u251c\u2500 vCPU \u7ebf\u7a0b 1  (ioctl KVM_RUN \u2192 \u8fdb\u5165 Guest Mode \u6267\u884c vCPU1 \u6307\u4ee4)\n \u251c\u2500 ...\n \u251c\u2500 I\/O \u7ebf\u7a0b \/ iothread\uff08\u5904\u7406\u78c1\u76d8\u3001\u7f51\u7edc\u7b49\u6a21\u62df\u8bbe\u5907\uff09\n \u2514\u2500 \u4e3b\u7ebf\u7a0b\uff08QEMU \u4e3b\u5faa\u73af\uff0c\u5904\u7406\u76d1\u63a7\u547d\u4ee4\u7b49\uff09\n\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>\u5173\u952e\u4e8b\u5b9e\uff1a\u4ece Linux \u8c03\u5ea6\u5668\u7684\u89c6\u89d2\u770b\uff0c\u6bcf\u4e00\u4e2a vCPU \u5c31\u662f\u5bbf\u4e3b\u673a\u4e0a\u4e00\u4e2a\u666e\u901a\u7684\uff08\u7528\u6237\u6001\uff09\u7ebf\u7a0b\u3002<\/strong> \u6ca1\u6709\u4efb\u4f55&#8221;\u865a\u62df\u673a\u4e13\u5c5e\u8c03\u5ea6\u5668&#8221;\u2014\u2014CFS \u5b8c\u5168\u4e0d\u77e5\u9053\u3001\u4e5f\u4e0d\u5173\u5fc3\u67d0\u4e2a\u7ebf\u7a0b\u662f\u4e0d\u662f\u5728\u8dd1\u4e00\u4e2a Guest OS\uff0c\u5b83\u53ea\u662f\u6309 vruntime \u516c\u5e73\u5730\u8c03\u5ea6\u8fd9\u4e9b\u7ebf\u7a0b\uff0c\u5c31\u50cf\u8c03\u5ea6\u4efb\u4f55\u666e\u901a\u8fdb\u7a0b\u7ebf\u7a0b\u4e00\u6837\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">vCPU \u7ebf\u7a0b\u7684\u8fd0\u884c\u6a21\u5f0f\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\u7ebf\u7a0b\u8c03\u7528 <code>ioctl(vcpu_fd, KVM_RUN, ...)<\/code> \u9677\u5165\u5185\u6838\u3002<\/li>\n\n\n\n<li>KVM \u5185\u6838\u6a21\u5757\u901a\u8fc7\u786c\u4ef6\u865a\u62df\u5316\u6269\u5c55\uff08Intel VT-x \u7684 <code>VMLAUNCH\/VMRESUME<\/code>\uff0cAMD-V \u7684 <code>VMRUN<\/code>\uff09\u5207\u6362 CPU \u8fdb\u5165 <strong>Guest Mode<\/strong>\uff0c\u6b64\u65f6 Guest OS \u7684\u6307\u4ee4\u76f4\u63a5\u7531\u7269\u7406 CPU \u6267\u884c\uff0c<strong>\u4e0d\u7ecf\u8fc7\u5bbf\u4e3b\u673a\u5185\u6838<\/strong>\uff0c\u6027\u80fd\u63a5\u8fd1\u88f8\u673a\u3002<\/li>\n\n\n\n<li>\u53d1\u751f <strong>VM Exit<\/strong>\uff08Guest \u6267\u884c\u4e86\u654f\u611f\u6307\u4ee4\u3001\u89e6\u53d1\u7f3a\u9875\u3001\u5916\u90e8\u4e2d\u65ad\u5230\u8fbe\u3001\u6267\u884c <code>HLT<\/code>\/<code>MWAIT<\/code> \u7b49\uff09\u65f6\uff0cCPU \u9000\u51fa Guest Mode\uff0c\u63a7\u5236\u6743\u4ea4\u8fd8\u7ed9 KVM \u5185\u6838\u4ee3\u7801\u5904\u7406\u3002<\/li>\n\n\n\n<li>KVM \u5904\u7406\u5b8c exit \u539f\u56e0\u540e\uff0c\u8981\u4e48\u7acb\u5373 <code>VMRESUME<\/code> \u7ee7\u7eed\u8dd1 Guest\uff0c\u8981\u4e48\u8fd4\u56de\u7528\u6237\u6001 QEMU \u5904\u7406\uff08\u5982\u6a21\u62df I\/O \u8bbe\u5907\uff09\uff0c\u5904\u7406\u5b8c\u518d\u6b21 <code>ioctl(KVM_RUN)<\/code>\u3002<\/li>\n\n\n\n<li>\u5982\u679c Guest \u6267\u884c\u4e86 <code>HLT<\/code>\uff08Guest \u5185\u6838\u8ba4\u4e3a\u81ea\u5df1\u7a7a\u95f2\u4e86\uff0c\u7b49\u4ef7\u4e8e\u7269\u7406\u673a\u7684 idle\uff09\uff0cvCPU \u7ebf\u7a0b\u4f1a\u8c03\u7528 <code>kvm_vcpu_block()<\/code>\uff0c\u901a\u8fc7 <code>schedule()<\/code> \u8ba9\u51fa CPU \u5e76\u8fdb\u5165\u7761\u7720\u2014\u2014<strong>\u6b64\u65f6\u5b83\u5c31\u662f\u4e00\u4e2a\u771f\u6b63\u963b\u585e\u6001\u7684 Linux \u7ebf\u7a0b\uff0c\u4f1a\u88ab CFS \u4ece\u8fd0\u884c\u961f\u5217\u6458\u9664<\/strong>\uff0c\u76f4\u5230\u6709\u4e2d\u65ad\/\u4e8b\u4ef6\u9700\u8981\u5524\u9192\u5b83\uff08\u5982\u865a\u62df\u65f6\u949f\u4e2d\u65ad\u3001virtio \u8bbe\u5907\u5b8c\u6210 I\/O\uff09\u3002<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">\u8fd9\u5c31\u662f\u4e3a\u4ec0\u4e48&#8221;vCPU \u7ebf\u7a0b&#8221;\u5bf9 CFS \u800c\u8a00\u662f\u4e00\u4e2a<strong>\u65f6\u800c\u7a81\u53d1\u8ba1\u7b97\u3001\u65f6\u800c\u7761\u7720\u7b49\u5f85<\/strong>\u7684\u666e\u901a\u7ebf\u7a0b\uff0c\u5176\u8c03\u5ea6\u884c\u4e3a\u5b8c\u5168\u9075\u5faa\u7b2c 3 \u8282\u6240\u8ff0\u7684 CFS \u901a\u7528\u89c4\u5219\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"7_CFS_%E5%A6%82%E4%BD%95%E8%B0%83%E5%BA%A6_vCPU_%E7%BA%BF%E7%A8%8B\"><\/span>7. CFS \u5982\u4f55\u8c03\u5ea6 vCPU \u7ebf\u7a0b<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u7ed3\u5408\u7b2c 3\u30015\u30016 \u8282\uff0cvCPU \u7ebf\u7a0b\u5728 CFS \u4e0b\u7684\u5b8c\u6574\u8c03\u5ea6\u753b\u50cf\uff1a<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"71_%E5%8A%A0%E5%85%A5%E8%BF%90%E8%A1%8C%E9%98%9F%E5%88%97%E4%B8%8E_vruntime_%E7%AB%9E%E4%BA%89\"><\/span>7.1 \u52a0\u5165\u8fd0\u884c\u961f\u5217\u4e0e vruntime \u7ade\u4e89<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5bbf\u4e3b\u673a\u4e0a\u6240\u6709\u53ef\u8fd0\u884c\u7ebf\u7a0b\uff08\u5305\u62ec\u6240\u6709\u865a\u62df\u673a\u7684\u6240\u6709 vCPU \u7ebf\u7a0b\u3001\u5bbf\u4e3b\u673a\u81ea\u8eab\u8fdb\u7a0b\u3001\u5176\u4ed6\u5bb9\u5668\u8fdb\u7a0b\uff09\u5171\u540c\u7ade\u4e89\u7269\u7406 CPU\uff0c\u901a\u8fc7 vruntime \u5927\u5c0f\u6392\u961f\u3002<\/li>\n\n\n\n<li>\u82e5\u672a\u505a CPU \u7ed1\u5b9a\uff08pinning\uff09\uff0cvCPU \u7ebf\u7a0b\u53ef\u4ee5\u88ab\u8d1f\u8f7d\u5747\u8861\u5668\uff08load balancer\uff0c\u89c1 7.3 \u8282\uff09\u8fc1\u79fb\u5230\u5bbf\u4e3b\u673a\u4efb\u610f\u7a7a\u95f2\u6838\u5fc3\u4e0a\u8fd0\u884c\uff0cLinux \u5e76\u4e0d\u4fdd\u8bc1\u540c\u4e00\u4e2a vCPU \u603b\u5728\u540c\u4e00\u7269\u7406\u6838\u4e0a\u8dd1\u3002<\/li>\n\n\n\n<li>vCPU \u7ebf\u7a0b\u7684 nice \u503c\u9ed8\u8ba4\u4e0e\u666e\u901a\u7ebf\u7a0b\u76f8\u540c\uff080\uff09\uff0c\u56e0\u6b64\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u5bbf\u4e3b\u673a\u4e0a\u7684\u4e00\u4e2a vCPU \u7ebf\u7a0b\u548c\u5bbf\u4e3b\u673a\u4e0a\u8dd1\u7684\u5176\u4ed6\u4efb\u610f\u8fdb\u7a0b\uff0c\u5728 CFS \u773c\u91cc&#8221;\u540c\u7b49\u91cd\u8981&#8221;\uff0c\u4f1a\u6309\u6743\u91cd\u516c\u5e73\u74dc\u5206 CPU\u2014\u2014\u8fd9\u4e5f\u662f\u4e3a\u4ec0\u4e48&#8221;CPU \u8d85\u914d\uff08overcommit\uff09&#8221;\u7684\u5bbf\u4e3b\u673a\u4e0a\uff0c\u666e\u901a\u4e1a\u52a1\u8fdb\u7a0b\u53ef\u80fd\u88ab\u865a\u62df\u673a\u6324\u5360 CPU \u7684\u539f\u56e0\u4e4b\u4e00\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"72_%E5%94%A4%E9%86%92%E6%8A%A2%E5%8D%A0%E4%B8%8E%E4%B8%AD%E6%96%AD%E5%93%8D%E5%BA%94%E5%BB%B6%E8%BF%9F\"><\/span>7.2 \u5524\u9192\u62a2\u5360\u4e0e\u4e2d\u65ad\u54cd\u5e94\u5ef6\u8fdf<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u865a\u62df\u673a\u5bf9<strong>\u8c03\u5ea6\u5ef6\u8fdf\uff08scheduling latency\uff09<\/strong>\u975e\u5e38\u654f\u611f\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Guest \u5185\u90e8\u4e00\u6b21\u65f6\u949f\u4e2d\u65ad\u3001\u7f51\u7edc\u5305\u5230\u8fbe\u3001\u78c1\u76d8 I\/O \u5b8c\u6210\uff0c\u90fd\u8981\u5148\u5728\u5bbf\u4e3b\u673a\u4e0a\u5524\u9192\u5bf9\u5e94\u7684 vCPU \u7ebf\u7a0b\uff08<code>kvm_vcpu_wake_up()<\/code> \u2192 <code>try_to_wake_up()<\/code>\uff09\uff0cvCPU \u7ebf\u7a0b\u88ab\u5524\u9192\u540e\u8981\u7b49\u5f85 CFS \u91cd\u65b0\u628a\u5b83\u8c03\u5ea6\u4e0a CPU\uff0c\u624d\u80fd\u628a\u8fd9\u4e2a&#8221;\u865a\u62df\u4e2d\u65ad&#8221;\u6ce8\u5165\u7ed9 Guest\u3002<\/li>\n\n\n\n<li>\u8fd9\u4e2d\u95f4\u7684\u7b49\u5f85\u65f6\u95f4\u79f0\u4e3a <strong>\u8c03\u5ea6\u5ef6\u8fdf\uff08scheduling latency\uff09<\/strong>\uff0c\u5bf9\u4e8e Guest \u5185\u90e8\u8fd0\u884c\u7684\u5b9e\u65f6\/\u4f4e\u5ef6\u8fdf\u5e94\u7528\uff08\u5982 Guest \u91cc\u7684\u5b9e\u65f6\u4efb\u52a1\u3001\u4f4e\u5ef6\u8fdf\u4ea4\u6613\u7cfb\u7edf\uff09\u662f\u5173\u952e\u6307\u6807\u3002<\/li>\n\n\n\n<li>\u5f97\u76ca\u4e8e CFS \u7684\u5524\u9192\u62a2\u5360\u673a\u5236\uff083.4 \u8282\uff09\uff0c\u521a\u4ece\u963b\u585e\u5524\u9192\u7684 vCPU \u7ebf\u7a0b vruntime \u901a\u5e38\u8f83\u5c0f\uff0c\u5bb9\u6613\u62a2\u5360\u5f53\u524d\u8fd0\u884c\u7684\u5176\u4ed6\u7ebf\u7a0b\uff0c\u8fd9\u5728\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u964d\u4f4e\u4e86\u5ef6\u8fdf\uff0c\u4f46<strong>\u5e76\u4e0d\u80fd\u63d0\u4f9b\u786c\u5b9e\u65f6\u4fdd\u8bc1<\/strong>\u2014\u2014\u5982\u679c\u5bbf\u4e3b\u673a\u4e25\u91cd\u8d85\u914d\u3001\u5927\u91cf\u4efb\u52a1\u7ade\u4e89\uff0cvCPU \u5524\u9192\u540e\u4ecd\u53ef\u80fd\u8981\u6392\u961f\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"73_%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E4%B8%8E_NUMA_%E6%84%9F%E7%9F%A5\"><\/span>7.3 \u8d1f\u8f7d\u5747\u8861\u4e0e NUMA \u611f\u77e5<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u591a\u6838\u7cfb\u7edf\u4e2d\uff0cCFS \u6bcf\u4e2a\u7269\u7406\u6838\u5fc3\u7ef4\u62a4\u81ea\u5df1\u7684\u8fd0\u884c\u961f\u5217\uff08<code>per-CPU runqueue<\/code>\uff09\uff0c\u9700\u8981\u9760<strong>\u8d1f\u8f7d\u5747\u8861\u5668<\/strong>\u5728\u6838\u5fc3\u95f4\u642c\u8fd0\u4efb\u52a1\u4ee5\u7ef4\u6301\u6574\u4f53\u5747\u8861\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5468\u671f\u6027\u8d1f\u8f7d\u5747\u8861<\/strong>\uff1a\u6bcf\u9694\u4e00\u5b9a tick\uff0c<code>load_balance()<\/code> \u68c0\u67e5\u8c03\u5ea6\u57df\uff08scheduling domain\uff0c\u6309 SMT\u2192Core\u2192LLC(\u672b\u7ea7\u7f13\u5b58)\u2192NUMA Node\u2192System \u5206\u5c42\uff09\u5185\u5404 CPU \u7684\u8d1f\u8f7d\u5dee\u5f02\uff0c\u5c06\u4efb\u52a1\u4ece\u7e41\u5fd9 CPU \u8fc1\u79fb\u5230\u7a7a\u95f2 CPU\u3002<\/li>\n\n\n\n<li><strong>NUMA \u611f\u77e5<\/strong>\uff1a\u865a\u62df\u673a\u5f80\u5f80\u88ab\u5206\u914d\u8de8 NUMA \u8282\u70b9\u7684\u5185\u5b58\u548c vCPU\uff0c\u5982\u679c vCPU \u7ebf\u7a0b\u88ab\u8fc1\u79fb\u5230\u4e0e\u5176\u8bbf\u95ee\u7684\u5185\u5b58\u4e0d\u5728\u540c\u4e00 NUMA \u8282\u70b9\u7684\u6838\u5fc3\u4e0a\u8fd0\u884c\uff0c\u4f1a\u4ea7\u751f\u663e\u8457\u7684\u8de8\u8282\u70b9\u5185\u5b58\u8bbf\u95ee\u5ef6\u8fdf\u3002Linux \u7684 <strong>NUMA Balancing<\/strong>\uff08<code>kernel.numa_balancing<\/code>\uff09\u4f1a\u5c1d\u8bd5\u628a\u4efb\u52a1\u548c\u5b83\u5e38\u8bbf\u95ee\u7684\u5185\u5b58\u9875\u8fc1\u79fb\u5230\u540c\u4e00\u8282\u70b9\uff0c\u4f46\u5bf9\u865a\u62df\u673a\u8fd9\u79cd\u5185\u5b58footprint \u5de8\u5927\u3001vCPU \u62d3\u6251\u9700\u8981\u7cbe\u786e\u66b4\u9732\u7ed9 Guest \u7684\u573a\u666f\uff0c\u5f80\u5f80\u66f4\u63a8\u8350<strong>\u624b\u52a8 CPU \u7ed1\u5b9a + NUMA \u7ed1\u5b9a<\/strong>\uff08\u89c1\u7b2c 10 \u8282\uff09\uff0c\u907f\u514d\u81ea\u52a8\u5747\u8861\u5e26\u6765\u7684\u4e0d\u786e\u5b9a\u6027\u3002<\/li>\n\n\n\n<li><strong>vCPU \u62d3\u6251\u4e0e\u7269\u7406\u62d3\u6251\u4e0d\u5339\u914d\u95ee\u9898<\/strong>\uff1a\u5982\u679c\u4e0d\u505a\u7ed1\u5b9a\uff0cGuest \u5185\u90e8\u901a\u8fc7 CPUID \u770b\u5230\u7684 vCPU \u62d3\u6251\uff08\u54ea\u4e9b vCPU \u5171\u4eab L2\/L3 cache\u3001\u662f\u5426\u540c\u4e00 SMT \u5bf9\uff09\u53ef\u80fd\u4e0e\u5bbf\u4e3b\u673a\u5b9e\u9645\u8c03\u5ea6\u4f4d\u7f6e\u5b8c\u5168\u4e0d\u7b26\uff0c\u5bfc\u81f4 Guest \u5185\u90e8\u7684\u8c03\u5ea6\u4f18\u5316\uff08\u6bd4\u5982 Guest \u81ea\u5df1\u7684 CFS \u4e5f\u5728\u505a\u7c7b\u4f3c\u51b3\u7b56\uff09\u4ea7\u751f\u8bef\u5224\u3002<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"8_%E8%99%9A%E6%8B%9F%E5%8C%96%E5%9C%BA%E6%99%AF%E4%B8%8B%E7%9A%84%E7%89%B9%E6%AE%8A%E8%B0%83%E5%BA%A6%E9%97%AE%E9%A2%98\"><\/span>8. \u865a\u62df\u5316\u573a\u666f\u4e0b\u7684\u7279\u6b8a\u8c03\u5ea6\u95ee\u9898<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"81_vCPU_Stealing_Time%EF%BC%88%E8%A2%AB%E7%AA%83%E5%8F%96%E6%97%B6%E9%97%B4%EF%BC%89\"><\/span>8.1 vCPU Stealing Time\uff08\u88ab\u7a83\u53d6\u65f6\u95f4\uff09<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5f53\u5bbf\u4e3b\u673a CPU \u8d85\u914d\uff08vCPU \u603b\u6570 &gt; \u7269\u7406\u6838\u5fc3\u6570\uff09\u65f6\uff0c\u4e00\u4e2a vCPU \u7ebf\u7a0b\u5373\u4f7f Guest \u5185\u90e8\u8ba4\u4e3a\u81ea\u5df1&#8221;\u5e94\u8be5\u8fd0\u884c&#8221;\uff0c\u4e5f\u53ef\u80fd\u56e0\u4e3a\u5bbf\u4e3b\u673a CFS \u628a\u7269\u7406 CPU \u5206\u7ed9\u4e86\u5176\u4ed6\u4efb\u52a1\u800c\u88ab\u8feb\u7b49\u5f85\u2014\u2014\u8fd9\u6bb5\u65f6\u95f4\u79f0\u4e3a <strong>steal time<\/strong>\u3002<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Guest \u5185\u6838\u53ef\u4ee5\u611f\u77e5 steal time\uff08\u901a\u8fc7 <code>kvm-clock<\/code> \u534a\u865a\u62df\u5316\u65f6\u949f\u91cc\u7684 steal time \u5b57\u6bb5\uff09\uff0c\u5e76\u5728 <code>\/proc\/stat<\/code> \u7684 <code>st<\/code> \u5217\u3001<code>top<\/code> \u7684 <code>%st<\/code> \u4e2d\u5c55\u793a\u3002<\/li>\n\n\n\n<li>Steal time \u8fc7\u9ad8\u8bf4\u660e\u5bbf\u4e3b\u673a CPU \u4e25\u91cd\u8d85\u914d\uff0cGuest \u5185\u90e8\u7684\u5e94\u7528\u4f1a\u611f\u53d7\u5230&#8221;CPU \u53d8\u6162\/\u5361\u987f&#8221;\uff0c\u5373\u4f7f Guest \u5185\u90e8\u770b\u8d77\u6765 CPU \u4f7f\u7528\u7387\u4e0d\u9ad8\u3002<\/li>\n\n\n\n<li>\u8fd9\u662f\u6392\u67e5&#8221;\u865a\u62df\u673a\u53d8\u6162\u4f46\u5185\u90e8\u770b\u4e0d\u51fa\u539f\u56e0&#8221;\u7684\u5173\u952e\u6307\u6807\u2014\u2014\u9700\u8981\u53bb<strong>\u5bbf\u4e3b\u673a<\/strong>\u4e0a\u770b\uff0c\u800c\u4e0d\u662f Guest \u5185\u90e8\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"82_Double_Scheduling%EF%BC%88%E5%8F%8C%E9%87%8D%E8%B0%83%E5%BA%A6%EF%BC%89%E9%97%AE%E9%A2%98\"><\/span>8.2 Double Scheduling\uff08\u53cc\u91cd\u8c03\u5ea6\uff09\u95ee\u9898<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u865a\u62df\u5316\u5f15\u5165\u4e86\u7ecf\u5178\u7684&#8221;\u53cc\u91cd\u8c03\u5ea6&#8221;\u96be\u9898\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Guest \u5185\u90e8\u6709\u81ea\u5df1\u7684\u8c03\u5ea6\u5668<\/strong>\uff08\u5982 Guest \u4e5f\u5728\u8dd1 Linux + CFS\uff09\uff0c\u51b3\u5b9a\u54ea\u4e2a Guest \u5185\u90e8\u4efb\u52a1\u8fd0\u884c\u5728\u54ea\u4e2a vCPU \u4e0a\u3002<\/li>\n\n\n\n<li><strong>\u5bbf\u4e3b\u673a\u4e5f\u6709\u8c03\u5ea6\u5668<\/strong>\uff08CFS\uff09\uff0c\u51b3\u5b9a\u54ea\u4e2a vCPU \u7ebf\u7a0b\u8fd0\u884c\u5728\u54ea\u4e2a\u7269\u7406\u6838\u5fc3\u4e0a\uff0c\u8fd0\u884c\u591a\u4e45\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e24\u5c42\u8c03\u5ea6\u5668\u4e92\u76f8\u4e0d\u611f\u77e5\u5bf9\u65b9\u7684\u51b3\u7b56\u4f9d\u636e\uff0c\u53ef\u80fd\u4ea7\u751f\u4e00\u7cfb\u5217\u95ee\u9898\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lock Holder Preemption\uff08LHP\uff0c\u9501\u6301\u6709\u8005\u88ab\u62a2\u5360\uff09<\/strong>\uff1aGuest \u5185\u90e8\u67d0\u4efb\u52a1\u6301\u6709\u81ea\u65cb\u9501\uff08spinlock\uff09\u65f6\uff0c\u5982\u679c\u5b83\u6240\u5728\u7684 vCPU \u6070\u597d\u88ab\u5bbf\u4e3b\u673a CFS \u6362\u4e0b CPU\uff0c\u90a3\u4e48 Guest \u5185\u5176\u4ed6\u7b49\u5f85\u8be5\u9501\u7684 vCPU \u4f1a\u6301\u7eed\u7a7a\u8f6c\uff08busy-wait\uff09\u5374\u6beb\u65e0\u8fdb\u5c55\uff0c\u76f4\u5230\u6301\u9501\u7684 vCPU \u91cd\u65b0\u88ab\u8c03\u5ea6\u2014\u2014\u4e25\u91cd\u6d6a\u8d39\u7269\u7406 CPU \u4e14\u62c9\u957f\u5ef6\u8fdf\u3002\u7f13\u89e3\u624b\u6bb5\u5305\u62ec <strong>Paravirtualized spinlock\uff08PV spinlock\uff09<\/strong>\uff1aGuest \u68c0\u6d4b\u5230\u81ea\u65cb\u7b49\u5f85\u8fc7\u4e45\u65f6\u4e3b\u52a8 <code>yield<\/code>\uff08\u901a\u8fc7 <code>PAUSE<\/code>-loop exiting \u6216 <code>KVM_HC_KICK_CPU<\/code> hypercall\uff09\uff0c\u8ba9\u5bbf\u4e3b\u673a\u8c03\u5ea6\u5668\u628a CPU \u8ba9\u7ed9\u771f\u6b63\u6301\u9501\u7684 vCPU\u3002<\/li>\n\n\n\n<li><strong>PLE\uff08Pause-Loop Exiting\uff09<\/strong>\uff1a\u73b0\u4ee3 Intel\/AMD CPU \u652f\u6301\u68c0\u6d4b Guest \u5185\u5bc6\u96c6\u6267\u884c <code>PAUSE<\/code> \u6307\u4ee4\uff08\u5178\u578b\u7684\u81ea\u65cb\u9501\u7b49\u5f85\u7279\u5f81\uff09\uff0c\u89e6\u53d1 VM Exit \u4ea4\u8fd8\u7ed9\u5bbf\u4e3b\u673a\uff0cKVM \u501f\u6b64\u673a\u4f1a\u4e3b\u52a8\u8ba9\u5bbf\u4e3b\u673a\u8c03\u5ea6\u5668\u628a\u7269\u7406 CPU \u8ba9\u7ed9\u5176\u4ed6\u66f4\u9700\u8981\u5b83\u7684 vCPU\uff08\u5982\u771f\u6b63\u6301\u9501\u7684\u90a3\u4e2a\uff09\uff0c\u7f13\u89e3 LHP\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"83_SCHED_FIFO_SCHED_DEADLINE_%E7%94%A8%E4%BA%8E_vCPU_%E7%BA%BF%E7%A8%8B\"><\/span>8.3 SCHED_FIFO \/ SCHED_DEADLINE \u7528\u4e8e vCPU \u7ebf\u7a0b<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u5bf9\u5ef6\u8fdf\u6781\u5ea6\u654f\u611f\u7684\u573a\u666f\uff08\u7535\u4fe1 NFV\u3001\u91d1\u878d\u4f4e\u5ef6\u8fdf\u3001\u5b9e\u65f6\u97f3\u89c6\u9891\uff09\uff0c\u5e38\u89c1\u505a\u6cd5\u662f\u8ba9 vCPU \u7ebf\u7a0b\u5b8c\u5168\u8131\u79bb CFS \u7ba1\u7406\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5c06 vCPU \u7ebf\u7a0b\u8bbe\u7f6e\u4e3a <code>SCHED_FIFO<\/code>\uff08\u5b9e\u65f6\u8c03\u5ea6\u7c7b\uff0c\u4f18\u5148\u7ea7\u9ad8\u4e8e CFS\uff0c\u89c1\u7b2c 4 \u8282\uff09\uff0c\u914d\u5408\u72ec\u5360\u7ed1\u6838\uff08<code>isolcpus<\/code>\/<code>cpuset<\/code>\uff09+ <code>nohz_full<\/code>\uff08\u5173\u95ed\u8be5\u6838\u5fc3\u7684\u5468\u671f\u6027\u65f6\u949f\u4e2d\u65ad\uff09+ RCU offload\uff0c\u5b9e\u73b0\u63a5\u8fd1\u88f8\u673a\u7684\u786e\u5b9a\u6027\u5ef6\u8fdf\u3002<\/li>\n\n\n\n<li>\u66f4\u4e25\u683c\u7684\u65b9\u6848\u4f7f\u7528 <code>SCHED_DEADLINE<\/code>\uff08\u57fa\u4e8e EDF + CBS \u5e26\u5bbd\u63a7\u5236\u7b97\u6cd5\uff09\uff0c\u4e3a vCPU \u663e\u5f0f\u58f0\u660e <code>(runtime, deadline, period)<\/code> \u4e09\u5143\u7ec4\uff0c\u5185\u6838\u63d0\u4f9b\u6570\u5b66\u4e0a\u53ef\u8bc1\u660e\u7684\u65f6\u9650\u4fdd\u8bc1\u3002\u8fd9\u7c7b\u914d\u7f6e\u5e38\u89c1\u4e8e libvirt \u7684 <code>&lt;cputune>&lt;vcpusched vcpus='0' scheduler='fifo' priority='1'\/>&lt;\/cputune><\/code>\u3002<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u4ee3\u4ef7\u662f\uff1a\u4e00\u65e6\u8131\u79bb CFS \u7684\u516c\u5e73\u8c03\u5ea6\uff0c\u8fd9\u4e9b vCPU \u7ebf\u7a0b\u4f1a<strong>\u62a2\u5360<\/strong>\u51e0\u4e4e\u6240\u6709 CFS \u7ba1\u7406\u7684\u666e\u901a\u8fdb\u7a0b\uff08\u5305\u62ec\u5bbf\u4e3b\u673a\u81ea\u8eab\u7684\u7ba1\u7406\u8fdb\u7a0b\uff09\uff0c\u5fc5\u987b\u8c28\u614e\u89c4\u5212\u3001\u901a\u5e38\u9700\u914d\u5408 CPU \u9694\u79bb\u4e00\u8d77\u4f7f\u7528\uff0c\u5426\u5219\u53ef\u80fd&#8221;\u997f\u6b7b&#8221;\u5bbf\u4e3b\u673a\u4e0a\u7684\u5176\u4ed6\u5173\u952e\u670d\u52a1\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"9_%E8%99%9A%E6%8B%9F%E6%9C%BA_CPU_%E8%B5%84%E6%BA%90%E9%99%90%E5%88%B6%E4%B8%8E%E9%9A%94%E7%A6%BB\"><\/span>9. \u865a\u62df\u673a CPU \u8d44\u6e90\u9650\u5236\u4e0e\u9694\u79bb<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u5728\u751f\u4ea7\u73af\u5883\uff08\u5c24\u5176\u662f\u4e91\u5e73\u53f0\/\u591a\u79df\u6237\u573a\u666f\uff09\uff0c\u901a\u5e38\u9700\u8981\u5bf9\u865a\u62df\u673a\u7684 CPU \u4f7f\u7528\u505a<strong>\u786c\u6027\u9650\u6d41<\/strong>\u4e0e<strong>\u4efd\u989d\u5206\u914d<\/strong>\uff0c\u8fd9\u4e00\u5c42\u5efa\u7acb\u5728 cgroup\uff08v1 \u7684 <code>cpu<\/code>\/<code>cpuset<\/code> \u5b50\u7cfb\u7edf\uff0c\u6216 v2 \u7684\u7edf\u4e00\u5c42\u7ea7\uff09\u4e4b\u4e0a\uff0clibvirt\/QEMU \u4f1a\u81ea\u52a8\u4e3a\u6bcf\u4e2a\u865a\u62df\u673a\u521b\u5efa\u5bf9\u5e94\u7684 cgroup\uff1a<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u673a\u5236<\/th><th>cgroup v1 \u53c2\u6570<\/th><th>cgroup v2 \u53c2\u6570<\/th><th>\u4f5c\u7528<\/th><\/tr><\/thead><tbody><tr><td><strong>\u4efd\u989d\uff08\u6743\u91cd\uff09<\/strong><\/td><td><code>cpu.shares<\/code><\/td><td><code>cpu.weight<\/code><\/td><td>\u51b3\u5b9a\u591a\u4e2a cgroup \u7ade\u4e89 CPU \u65f6\u7684\u76f8\u5bf9\u6bd4\u4f8b\u5206\u914d\uff08\u8f6f\u9650\u5236\uff0cCPU \u7a7a\u95f2\u65f6\u4e0d\u53d7\u9650\uff09<\/td><\/tr><tr><td><strong>\u786c\u9650\u6d41\uff08Bandwidth Control\uff09<\/strong><\/td><td><code>cpu.cfs_quota_us<\/code> \/ <code>cpu.cfs_period_us<\/code><\/td><td><code>cpu.max<\/code><\/td><td>\u5728\u6bcf\u4e2a\u5468\u671f\uff08\u9ed8\u8ba4 100ms\uff09\u5185\uff0c\u8be5 cgroup \u6700\u591a\u80fd\u4f7f\u7528\u7684 CPU \u65f6\u95f4\u603b\u91cf\uff0c\u8d85\u8fc7\u5219\u88ab\u8282\u6d41\uff08throttle\uff09\uff0c\u5373\u4f7f\u8fd8\u6709\u7a7a\u95f2 CPU \u4e5f\u4e0d\u80fd\u7528<\/td><\/tr><tr><td><strong>CPU \u7ed1\u5b9a<\/strong><\/td><td><code>cpuset.cpus<\/code><\/td><td><code>cpuset.cpus<\/code>\uff08\u5728 cpuset \u63a7\u5236\u5668\u4e0b\uff09<\/td><td>\u9650\u5b9a\u8be5 cgroup \u5185\u7ebf\u7a0b\u53ea\u80fd\u5728\u6307\u5b9a\u7269\u7406\u6838\u5fc3\u96c6\u5408\u4e0a\u8fd0\u884c\uff0c\u914d\u5408 <code>virsh vcpupin<\/code> \u5b9e\u73b0 vCPU \u5230 pCPU \u7684\u7cbe\u786e\u7ed1\u5b9a<\/td><\/tr><tr><td><strong>\u5185\u5b58\u8282\u70b9\u7ed1\u5b9a<\/strong><\/td><td><code>cpuset.mems<\/code><\/td><td><code>cpuset.mems<\/code><\/td><td>\u9650\u5b9a\u53ea\u80fd\u5206\u914d\u6307\u5b9a NUMA \u8282\u70b9\u5185\u5b58\uff0c\u914d\u5408 CPU \u7ed1\u5b9a\u907f\u514d\u8de8\u8282\u70b9\u8bbf\u95ee<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>CFS Bandwidth Control\uff08quota\/period\uff09\u7684\u5de5\u4f5c\u539f\u7406<\/strong>\uff1a\u8c03\u5ea6\u5668\u7ed9 cgroup \u5206\u914d\u4e00\u4e2a&#8221;CPU \u65f6\u95f4\u94f6\u884c&#8221;\uff0c\u6bcf\u4e2a <code>period<\/code>\uff08\u5982 100ms\uff09\u5f00\u59cb\u65f6\u8d26\u6237\u88ab\u5145\u503c\u5230 <code>quota<\/code>\uff0ccgroup \u5185\u6240\u6709\u7ebf\u7a0b\u6d88\u8017\u8fd9\u4e2a\u5171\u4eab\u989d\u5ea6\uff0c\u989d\u5ea6\u8017\u5c3d\u540e\u7ec4\u5185\u6240\u6709\u53ef\u8fd0\u884c\u4efb\u52a1\u4f1a\u88ab<strong>\u8282\u6d41\uff08throttled\uff09<\/strong>\u2014\u2014\u4ece\u8fd0\u884c\u961f\u5217\u6458\u9664\uff0c\u5373\u4f7f\u7269\u7406 CPU \u7a7a\u95f2\u4e5f\u4e0d\u4f1a\u88ab\u8c03\u5ea6\uff0c\u5fc5\u987b\u7b49\u5230\u4e0b\u4e00\u4e2a period \u91cd\u65b0\u5145\u503c\u3002\u8fd9\u89e3\u91ca\u4e86\u4e91\u5e73\u53f0\u4e0a&#8221;\u865a\u62df\u673a vCPU \u4f7f\u7528\u7387\u660e\u660e\u6ca1\u5230 100% \u5374\u611f\u89c9\u5361\u987f&#8221;\u7684\u5e38\u89c1\u539f\u56e0\uff1a\u53ef\u80fd\u4e0d\u662f vruntime \u6392\u961f\u6162\uff0c\u800c\u662f\u914d\u989d\u8017\u5c3d\u88ab\u5f3a\u5236\u8282\u6d41\uff08\u53ef\u901a\u8fc7 <code>nr_throttled<\/code>\/<code>throttled_time<\/code> \u89c2\u6d4b\uff0c\u89c1\u7b2c 11 \u8282\uff09\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"10_%E6%80%A7%E8%83%BD%E8%B0%83%E4%BC%98%E5%AE%9E%E8%B7%B5\"><\/span>10. \u6027\u80fd\u8c03\u4f18\u5b9e\u8df5<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u9488\u5bf9\u5ef6\u8fdf\u654f\u611f\u578b\/\u8ba1\u7b97\u5bc6\u96c6\u578b\u865a\u62df\u673a\u7684\u5178\u578b\u8c03\u4f18\u7ec4\u5408\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>CPU \u7ed1\u5b9a\uff08Pinning\uff09<\/strong>\uff1a<code>virsh vcpupin &lt;domain> &lt;vcpu> &lt;pcpu><\/code>\uff0c\u5c06\u6bcf\u4e2a vCPU \u7ebf\u7a0b\u56fa\u5b9a\u5230\u7279\u5b9a\u7269\u7406\u6838\u5fc3\uff0c\u907f\u514d\u8d1f\u8f7d\u5747\u8861\u5668\u968f\u610f\u8fc1\u79fb\u5e26\u6765\u7684\u7f13\u5b58\u5931\u6548\u548c\u5ef6\u8fdf\u6296\u52a8\u3002<\/li>\n\n\n\n<li><strong>NUMA \u7ed1\u5b9a<\/strong>\uff1a<code>virsh numatune<\/code> \u914d\u5408 <code>vcpupin<\/code>\uff0c\u786e\u4fdd vCPU \u8fd0\u884c\u7684\u6838\u5fc3\u4e0e\u5176\u8bbf\u95ee\u7684\u5185\u5b58\u5728\u540c\u4e00 NUMA \u8282\u70b9\uff0c\u5e76\u901a\u8fc7 <code>&lt;numa><\/code> \u62d3\u6251\u5411 Guest \u66b4\u9732\u771f\u5b9e\u7684 NUMA \u7ed3\u6784\u3002<\/li>\n\n\n\n<li><strong>CPU \u9694\u79bb\uff08<code>isolcpus<\/code>\/cpuset\uff09<\/strong>\uff1a\u5c06\u4e00\u90e8\u5206\u7269\u7406\u6838\u5fc3\u4ece\u5185\u6838\u9ed8\u8ba4\u8c03\u5ea6\u57df\u4e2d\u6392\u9664\uff0c\u4e13\u4f9b\u865a\u62df\u673a vCPU \u4f7f\u7528\uff0c\u907f\u514d\u5bbf\u4e3b\u673a\u5176\u4ed6\u8fdb\u7a0b\/\u4e2d\u65ad\u62a2\u5360\u8fd9\u4e9b\u6838\u5fc3\u3002<\/li>\n\n\n\n<li><strong>\u4e13\u7528 housekeeping \u6838\u5fc3<\/strong>\uff1a\u5c06\u4e2d\u65ad\u5904\u7406\u3001emulator \u7ebf\u7a0b\u3001iothread \u7b49\u7559\u5728\u5c11\u6570\u51e0\u4e2a&#8221;\u7ba1\u7406\u6838\u5fc3&#8221;\u4e0a\uff0c\u4e1a\u52a1 vCPU \u72ec\u5360\u5176\u4f59\u6838\u5fc3\uff0c\u51cf\u5c11 VM Exit \u5904\u7406\u548c\u4e2d\u65ad\u5bf9 Guest \u8ba1\u7b97\u7684\u5e72\u6270\u3002<\/li>\n\n\n\n<li><strong>\u5173\u95ed\u8be5\u6838\u5fc3\u7684\u65f6\u949f\u4e2d\u65ad\uff08<code>nohz_full<\/code>\uff09+ RCU offload<\/strong>\uff1a\u51cf\u5c11\u4e0d\u5fc5\u8981\u7684 VM Exit\uff08\u6bcf\u6b21\u5468\u671f\u6027\u65f6\u949f\u4e2d\u65ad\u90fd\u53ef\u80fd\u5bfc\u81f4 VM Exit\uff09\u3002<\/li>\n\n\n\n<li><strong>\u7ed1\u5b9a\u4e0e\u5173\u95ed\u8d85\u7ebf\u7a0b\/SMT \u8003\u91cf<\/strong>\uff1a\u82e5\u5ef6\u8fdf\u8981\u6c42\u6781\u9ad8\uff0c\u53ef\u8003\u8651\u5173\u95ed SMT \u6216\u81f3\u5c11\u4fdd\u8bc1\u540c\u4e00\u865a\u62df\u673a\u7684 vCPU \u4e0d\u4e0e\u5176\u4ed6\u79df\u6237\u5171\u4eab\u540c\u4e00\u7269\u7406\u6838\u5fc3\u7684\u4e24\u4e2a SMT \u7ebf\u7a0b\uff08\u4e5f\u662f side-channel \u5b89\u5168\u9694\u79bb\u7684\u5e38\u89c1\u8981\u6c42\uff09\u3002<\/li>\n\n\n\n<li>**\u5408\u7406\u8bbe\u7f6e <code>cpu.shares<\/code>\/<code>cpu.weight<\/code> \u548c <code>quota\/period<\/code>**\uff1a\u907f\u514d\u56e0\u4e3a\u9650\u6d41\u7c92\u5ea6\uff08period \u592a\u77ed\u5bfc\u81f4\u7a81\u53d1\u8ba1\u7b97\u88ab\u8fc7\u65e9\u8282\u6d41\uff09\u8bbe\u7f6e\u4e0d\u5f53\u5f15\u5165\u4eba\u4e3a\u6296\u52a8\uff0c\u901a\u5e38\u5efa\u8bae period \u4e0d\u5c0f\u4e8e 100ms\uff0cquota \u6309\u9884\u671f\u5e73\u5747\u4f7f\u7528\u7387\u8bbe\u7f6e\u5e76\u9884\u7559\u4f59\u91cf\u5e94\u5bf9\u7a81\u53d1\u3002<\/li>\n\n\n\n<li><strong>virtio + vhost \u5378\u8f7d<\/strong>\uff1a\u5c06\u7f51\u7edc\/\u78c1\u76d8 I\/O \u6a21\u62df\u4ece QEMU \u4e3b\u7ebf\u7a0b\u5378\u8f7d\u5230\u5185\u6838\u6001 <code>vhost<\/code> \u7ebf\u7a0b\uff08\u672c\u8eab\u4e5f\u662f\u5bbf\u4e3b\u673a\u4e0a\u53d7 CFS \u8c03\u5ea6\u7684\u7ebf\u7a0b\uff0c\u4f46\u51cf\u5c11\u4e86\u7528\u6237\u6001\/\u5185\u6838\u6001\u5207\u6362\u6b21\u6570\uff09\uff0c\u964d\u4f4e I\/O \u8def\u5f84\u5bf9 vCPU \u8c03\u5ea6\u7684\u5e72\u6270\u3002<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"11_%E8%A7%82%E6%B5%8B%E4%B8%8E%E8%B0%83%E8%AF%95%E5%B7%A5%E5%85%B7\"><\/span>11. \u89c2\u6d4b\u4e0e\u8c03\u8bd5\u5de5\u5177<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u5de5\u5177\/\u63a5\u53e3<\/th><th>\u7528\u9014<\/th><\/tr><\/thead><tbody><tr><td><code>top<\/code> \/ <code>htop<\/code> \u4e2d\u7684 <code>%st<\/code> \u5217<\/td><td>\u89c2\u6d4b steal time\uff0c\u5224\u65ad\u5bbf\u4e3b\u673a\u662f\u5426\u8d85\u914d<\/td><\/tr><tr><td><code>pidstat -t -p &lt;qemu_pid&gt;<\/code><\/td><td>\u89c2\u6d4b QEMU \u8fdb\u7a0b\u4e0b\u5404 vCPU \u7ebf\u7a0b\u7684 CPU \u4f7f\u7528\u3001\u4e0a\u4e0b\u6587\u5207\u6362\u6b21\u6570<\/td><\/tr><tr><td><code>perf sched record\/latency\/timehist<\/code><\/td><td>\u8bb0\u5f55\u5e76\u5206\u6790\u8c03\u5ea6\u5ef6\u8fdf\u3001\u5524\u9192\u5ef6\u8fdf\u3001\u5404\u7ebf\u7a0b\u5b9e\u9645\u83b7\u5f97\u7684 CPU \u65f6\u95f4\u5206\u5e03<\/td><\/tr><tr><td><code>\/proc\/&lt;pid&gt;\/task\/&lt;tid&gt;\/sched<\/code><\/td><td>\u67e5\u770b\u5355\u4e2a\u7ebf\u7a0b\uff08vCPU \u7ebf\u7a0b\uff09\u7684 vruntime\u3001nr_switches\u3001\u8c03\u5ea6\u7edf\u8ba1<\/td><\/tr><tr><td><code>\/proc\/sched_debug<\/code><\/td><td>\u5168\u5c40\u8c03\u5ea6\u5668\u72b6\u6001\u8f6c\u50a8\uff0c\u5305\u62ec\u5404 CPU \u8fd0\u884c\u961f\u5217\u3001cgroup \u5c42\u7ea7 vruntime<\/td><\/tr><tr><td><code>cat \/sys\/fs\/cgroup\/...\/cpu.stat<\/code><\/td><td>\u67e5\u770b cgroup \u7684 <code>nr_periods<\/code>\u3001<code>nr_throttled<\/code>\u3001<code>throttled_time<\/code>\uff0c\u5224\u65ad\u662f\u5426\u88ab quota \u8282\u6d41<\/td><\/tr><tr><td><code>virsh vcpuinfo &lt;domain&gt;<\/code> \/ <code>virsh vcpupin &lt;domain&gt;<\/code><\/td><td>\u67e5\u770b\/\u8bbe\u7f6e vCPU \u4e0e\u7269\u7406\u6838\u5fc3\u7684\u7ed1\u5b9a\u72b6\u6001<\/td><\/tr><tr><td><code>numastat -c qemu<\/code><\/td><td>\u67e5\u770b\u865a\u62df\u673a\u8de8 NUMA \u8282\u70b9\u7684\u5185\u5b58\u8bbf\u95ee\u7edf\u8ba1<\/td><\/tr><tr><td><code>trace-cmd<\/code> \/ <code>ftrace<\/code> (<code>sched_switch<\/code>, <code>kvm_exit<\/code> \u7b49 tracepoint)<\/td><td>\u7cbe\u7ec6\u8ffd\u8e2a VM Exit \u539f\u56e0\u5206\u5e03\u3001\u8c03\u5ea6\u5207\u6362\u4e8b\u4ef6\u65f6\u5e8f<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"12_EEVDF%EF%BC%9ACFS_%E7%9A%84%E7%BB%A7%E4%BB%BB%E8%80%85\"><\/span>12. EEVDF\uff1aCFS \u7684\u7ee7\u4efb\u8005<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Linux 6.6\uff082023 \u5e74\u5e95\uff09\u5f00\u59cb\uff0cCFS \u9010\u6b65\u88ab <strong>EEVDF\uff08Earliest Eligible Virtual Deadline First\uff09<\/strong> \u53d6\u4ee3\uff08\u7531 Peter Zijlstra \u5b9e\u73b0\uff09\uff0c\u5e76\u5728\u540e\u7eed\u7248\u672c\u4e2d\u6210\u4e3a\u9ed8\u8ba4\u8c03\u5ea6\u5668\u3002\u6838\u5fc3\u52a8\u673a\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>CFS \u7684&#8221;\u5b8c\u5168\u516c\u5e73&#8221;\u662f<strong>\u957f\u671f\u5e73\u5747\u610f\u4e49\u4e0a<\/strong>\u7684\u516c\u5e73\uff0c\u77ed\u671f\u5185\u67d0\u4e2a\u4efb\u52a1\u53ef\u80fd\u6301\u7eed\u88ab\u522b\u7684\u4efb\u52a1\u63d2\u961f\uff0c\u5bfc\u81f4\u5ef6\u8fdf\u4e0d\u53ef\u9884\u6d4b\uff1b\u7eaf\u7cb9\u4f9d\u8d56\u5524\u9192\u62a2\u5360\u7684\u542f\u53d1\u5f0f\uff08<code>sched_wakeup_granularity_ns<\/code>\uff09\u96be\u4ee5\u7ed9\u51fa\u7406\u8bba\u4fdd\u8bc1\u3002<\/li>\n\n\n\n<li>EEVDF \u4e3a\u6bcf\u4e2a\u4efb\u52a1\u989d\u5916\u7ef4\u62a4\u4e00\u4e2a <strong>\u865a\u62df\u622a\u6b62\u65f6\u95f4\uff08virtual deadline\uff09<\/strong> = vruntime + \u8bf7\u6c42\u65f6\u95f4\u7247\/\u6743\u91cd\uff0c\u8c03\u5ea6\u65f6\u4f18\u5148\u9009\u62e9&#8221;\u5df2\u7ecf\u6709\u8d44\u683c\u8fd0\u884c\uff08eligible\uff0c\u5373\u5df2\u6b20\u516c\u5e73\u4efd\u989d\uff09\u4e14\u865a\u62df\u622a\u6b62\u65f6\u95f4\u6700\u65e9&#8221;\u7684\u4efb\u52a1\uff0c\u4ece\u7406\u8bba\u4e0a\u66f4\u63a5\u8fd1 GPS\uff08Generalized Processor Sharing\uff09\u7406\u60f3\u6a21\u578b\uff0c\u540c\u65f6\u80fd\u8868\u8fbe&#8221;\u67d0\u4efb\u52a1\u60f3\u8981\u66f4\u5c0f\u65f6\u95f4\u7247\u3001\u66f4\u5feb\u54cd\u5e94&#8221;\u7684\u8bc9\u6c42\uff08\u901a\u8fc7 <code>sched_setattr<\/code> \u7684 <code>sched_runtime<\/code> \u63d0\u793a\uff09\u3002<\/li>\n\n\n\n<li>\u5bf9\u865a\u62df\u673a\u8c03\u5ea6\u800c\u8a00\uff0cEEVDF \u7406\u8bba\u4e0a\u80fd\u63d0\u4f9b\u66f4\u5e73\u6ed1\u3001\u66f4\u53ef\u9884\u6d4b\u7684 vCPU \u5524\u9192\u5ef6\u8fdf\uff0c\u51cf\u5c11\u5ef6\u8fdf\u6296\u52a8\uff0c\u4f46\u76ee\u524d\uff082026 \u5e74\uff09\u5728\u751f\u4ea7\u73af\u5883\u7684\u5927\u89c4\u6a21\u865a\u62df\u5316\u5b9e\u8df5\u79ef\u7d2f\u4ecd\u5728\u589e\u957f\u4e2d\uff0c\u5177\u4f53\u6536\u76ca\u9700\u7ed3\u5408\u5b9e\u9645\u5185\u6838\u7248\u672c\u548c\u5de5\u4f5c\u8d1f\u8f7d\u9a8c\u8bc1\u3002<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99%E6%96%B9%E5%90%91%EF%BC%88%E4%BE%9B%E8%BF%9B%E4%B8%80%E6%AD%A5%E6%9F%A5%E9%98%85%EF%BC%89\"><\/span>\u53c2\u8003\u8d44\u6599\u65b9\u5411\uff08\u4f9b\u8fdb\u4e00\u6b65\u67e5\u9605\uff09<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5185\u6838\u6e90\u7801\uff1a<code>kernel\/sched\/fair.c<\/code>\uff08CFS\/EEVDF \u5b9e\u73b0\uff09\u3001<code>kernel\/sched\/core.c<\/code>\uff08\u8c03\u5ea6\u6846\u67b6\uff09<\/li>\n\n\n\n<li><code>Documentation\/scheduler\/sched-design-CFS.rst<\/code><\/li>\n\n\n\n<li>KVM \u5b98\u65b9\u6587\u6863\u4e0e <code>Documentation\/virt\/kvm\/<\/code><\/li>\n\n\n\n<li>libvirt \u6587\u6863\u4e2d\u7684 <code>&lt;cputune><\/code>\u3001<code>&lt;numatune><\/code> \u5143\u7d20\u8bf4\u660e<\/li>\n\n\n\n<li>Red Hat\u300aVirtualization Tuning and Optimization Guide\u300b<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>1. CPU \u8c03\u5ea6\u5668\u57fa\u7840\u6982\u5ff5 CPU \u8c03\u5ea6\u5668\uff08Scheduler\uff09\u662f\u64cd\u4f5c\u7cfb\u7edf\u5185\u6838\u7684\u6838\u5fc3\u7ec4\u4ef6\uff0c\u8d1f\u8d23\u51b3\u5b9a&#038;#822 &#8230; <a title=\"CPU\u8c03\u5ea6\u5668\u539f\u7406\u4e0eLinux CFS \u865a\u62df\u673a\u8c03\u5ea6\u8be6\u89e3\" class=\"read-more\" href=\"https:\/\/www.mooloco.com\/?p=329\" aria-label=\"\u9605\u8bfb CPU\u8c03\u5ea6\u5668\u539f\u7406\u4e0eLinux CFS \u865a\u62df\u673a\u8c03\u5ea6\u8be6\u89e3\">\u9605\u8bfb\u66f4\u591a<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","footnotes":""},"categories":[13],"tags":[],"class_list":["post-329","post","type-post","status-publish","format-standard","hentry","category-main_contents"],"_links":{"self":[{"href":"https:\/\/www.mooloco.com\/index.php?rest_route=\/wp\/v2\/posts\/329","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mooloco.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mooloco.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mooloco.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mooloco.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=329"}],"version-history":[{"count":2,"href":"https:\/\/www.mooloco.com\/index.php?rest_route=\/wp\/v2\/posts\/329\/revisions"}],"predecessor-version":[{"id":331,"href":"https:\/\/www.mooloco.com\/index.php?rest_route=\/wp\/v2\/posts\/329\/revisions\/331"}],"wp:attachment":[{"href":"https:\/\/www.mooloco.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=329"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mooloco.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=329"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mooloco.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=329"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}