{"id":587,"date":"2024-02-20T10:45:36","date_gmt":"2022-12-07T20:28:01","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/index.php\/2023\/11\/30\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/"},"modified":"2025-08-02T21:03:28","modified_gmt":"2025-08-02T13:03:28","slug":"%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/","title":{"rendered":"Node.js\u96c6\u7fa4\u6280\u672f\u5b8c\u5168\u6307\u5357\uff1a\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u6269\u5c55\u6027\u768410\u79cd\u65b9\u6cd5"},"content":{"rendered":"<h3>\u5f15\u8a00<\/h3>\n<p>\u5f53\u60a8\u5728\u5177\u6709\u591a\u4e2aCPU\u7684\u7cfb\u7edf\u4e0a\u8fd0\u884cNode.js\u7a0b\u5e8f\u65f6\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u5b83\u4f1a\u521b\u5efa\u4e00\u4e2a\u4ec5\u4f7f\u7528\u5355\u4e2aCPU\u6267\u884c\u8fdb\u7a0b\u3002\u7531\u4e8eNode.js\u4f7f\u7528\u5355\u7ebf\u7a0b\u6765\u6267\u884cJavaScript\u4ee3\u7801\uff0c\u6240\u6709\u5bf9\u5e94\u7528\u7a0b\u5e8f\u7684\u8bf7\u6c42\u90fd\u5fc5\u987b\u7531\u8be5\u7ebf\u7a0b\u5728\u5355\u4e2aCPU\u4e0a\u5904\u7406\u3002\u5982\u679c\u5e94\u7528\u7a0b\u5e8f\u6709CPU\u5bc6\u96c6\u578b\u4efb\u52a1\uff0c\u64cd\u4f5c\u7cfb\u7edf\u5fc5\u987b\u8c03\u5ea6\u5b83\u4eec\u5171\u4eab\u5355\u4e2aCPU\u76f4\u5230\u5b8c\u6210\u3002\u5982\u679c\u8fdb\u7a0b\u63a5\u6536\u5230\u8fc7\u591a\u8bf7\u6c42\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4\u5355\u4e2a\u8fdb\u7a0b\u8fc7\u8f7d\uff0c\u4ece\u800c\u964d\u4f4e\u6027\u80fd\u3002\u5982\u679c\u8fdb\u7a0b\u5d29\u6e83\uff0c\u7528\u6237\u5c06\u65e0\u6cd5\u8bbf\u95ee\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<p>\u4f5c\u4e3a\u89e3\u51b3\u65b9\u6848\uff0cNode.js\u5f15\u5165\u4e86\u96c6\u7fa4\u6a21\u5757\uff0c\u5b83\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u521b\u5efa\u591a\u4e2a\u76f8\u540c\u5e94\u7528\u7a0b\u5e8f\u7684\u526f\u672c\uff0c\u5e76\u8ba9\u5b83\u4eec\u540c\u65f6\u8fd0\u884c\u3002\u5b83\u8fd8\u9644\u5e26\u4e00\u4e2a\u8d1f\u8f7d\u5747\u8861\u5668\uff0c\u4f7f\u7528\u8f6e\u8be2\u7b97\u6cd5\u5728\u8fdb\u7a0b\u4e4b\u95f4\u5747\u5300\u5206\u914d\u8d1f\u8f7d\u3002\u5982\u679c\u5355\u4e2a\u5b9e\u4f8b\u5d29\u6e83\uff0c\u7528\u6237\u4ecd\u53ef\u4ee5\u7531\u4ecd\u5728\u8fd0\u884c\u7684\u5269\u4f59\u8fdb\u7a0b\u63d0\u4f9b\u670d\u52a1\u3002\u7531\u4e8e\u8d1f\u8f7d\u5728\u591a\u4e2a\u8fdb\u7a0b\u4e4b\u95f4\u5747\u5300\u5171\u4eab\uff0c\u9632\u6b62\u4e86\u5355\u4e2a\u5b9e\u4f8b\u8fc7\u8f7d\uff0c\u5e94\u7528\u7a0b\u5e8f\u7684\u6027\u80fd\u663e\u8457\u63d0\u9ad8\u3002<\/p>\n<p>\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u60a8\u5c06\u5728\u5177\u6709\u56db\u4e2a\u6216\u66f4\u591aCPU\u7684\u673a\u5668\u4e0a\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\u6269\u5c55Node.js\u5e94\u7528\u7a0b\u5e8f\u3002\u60a8\u5c06\u521b\u5efa\u4e00\u4e2a\u4e0d\u4f7f\u7528\u96c6\u7fa4\u7684\u5e94\u7528\u7a0b\u5e8f\uff0c\u7136\u540e\u4fee\u6539\u5e94\u7528\u7a0b\u5e8f\u4ee5\u4f7f\u7528\u96c6\u7fa4\u3002\u60a8\u8fd8\u5c06\u4f7f\u7528pm2\u6a21\u5757\u5728\u591a\u4e2aCPU\u4e0a\u6269\u5c55\u5e94\u7528\u7a0b\u5e8f\u3002\u60a8\u5c06\u4f7f\u7528\u8d1f\u8f7d\u6d4b\u8bd5\u5de5\u5177\u6bd4\u8f83\u4f7f\u7528\u96c6\u7fa4\u548c\u4e0d\u4f7f\u7528\u96c6\u7fa4\u7684\u5e94\u7528\u7a0b\u5e8f\u7684\u6027\u80fd\uff0c\u5e76\u8bc4\u4f30pm2\u6a21\u5757\u3002<\/p>\n<h2>\u5148\u51b3\u6761\u4ef6<\/h2>\n<p>\u8981\u5b66\u4e60\u672c\u6559\u7a0b\uff0c\u60a8\u9700\u8981\u4ee5\u4e0b\u6761\u4ef6\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>\u4e00\u4e2a\u5177\u6709\u56db\u4e2a\u6216\u66f4\u591aCPU\u7684\u7cfb\u7edf\u3002\u5982\u679c\u60a8\u4f7f\u7528\u7684\u662f\u5e26\u6709Ubuntu 22.04\u7684\u8fdc\u7a0b\u670d\u52a1\u5668\uff0c\u53ef\u4ee5\u6309\u7167\u6211\u4eec\u7684\u300a\u521d\u59cb\u670d\u52a1\u5668\u8bbe\u7f6e\u300b\u6307\u5357\u8bbe\u7f6e\u7cfb\u7edf\u3002<\/li>\n<li>\u5728\u60a8\u7684\u5f00\u53d1\u73af\u5883\u4e2d\u8bbe\u7f6eNode.js\u3002\u5982\u679c\u60a8\u8fd0\u884c\u7684\u662fUbuntu 22.04\uff0c\u8bf7\u9075\u5faa\u300a\u5982\u4f55\u5728Ubuntu 22.04\u4e0a\u5b89\u88c5Node.js\u300b\u7684\u9009\u98793\u3002\u5bf9\u4e8e\u5176\u4ed6\u7cfb\u7edf\uff0c\u8bf7\u8bbf\u95ee\u300a\u5982\u4f55\u5b89\u88c5Node.js\u5e76\u521b\u5efa\u672c\u5730\u5f00\u53d1\u73af\u5883\u300b\u3002<\/li>\n<li>\u4f7f\u7528Express\u7684\u57fa\u672c\u77e5\u8bc6\uff0c\u60a8\u53ef\u4ee5\u901a\u8fc7\u300aNode.js\u548cExpress\u5165\u95e8\u6307\u5357\u300b\u6765\u590d\u4e60\u3002<\/li>\n<\/ul>\n<h2>\u6b65\u9aa41 &#8211; \u8bbe\u7f6e\u9879\u76ee\u76ee\u5f55<\/h2>\n<p>\u5728\u6b64\u6b65\u9aa4\u4e2d\uff0c\u60a8\u5c06\u4e3a\u9879\u76ee\u521b\u5efa\u76ee\u5f55\u5e76\u4e0b\u8f7d\u5c06\u5728\u672c\u6559\u7a0b\u540e\u9762\u6784\u5efa\u7684\u5e94\u7528\u7a0b\u5e8f\u7684\u4f9d\u8d56\u9879\u3002\u5728\u6b65\u9aa42\u4e2d\uff0c\u60a8\u5c06\u4f7f\u7528Express\u6784\u5efa\u5e94\u7528\u7a0b\u5e8f\u3002\u7136\u540e\uff0c\u60a8\u5c06\u5728\u6b65\u9aa43\u4e2d\u4f7f\u7528\u5185\u7f6e\u7684node-cluster\u6a21\u5757\u5c06\u5176\u6269\u5c55\u5230\u591a\u4e2aCPU\uff0c\u5e76\u5c06\u5728\u6b65\u9aa44\u4e2d\u4f7f\u7528loadtest\u5305\u8fdb\u884c\u6d4b\u91cf\u3002\u4e4b\u540e\uff0c\u60a8\u5c06\u4f7f\u7528pm2\u5305\u8fdb\u884c\u6269\u5c55\u5e76\u5728\u6b65\u9aa45\u4e2d\u518d\u6b21\u6d4b\u91cf\u3002<\/p>\n<p>\u9996\u5148\uff0c\u521b\u5efa\u4e00\u4e2a\u76ee\u5f55\u3002\u60a8\u53ef\u4ee5\u5c06\u5176\u547d\u540d\u4e3acluster_demo\u6216\u60a8\u559c\u6b22\u7684\u4efb\u4f55\u76ee\u5f55\u540d\u79f0\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">mkdir<\/span> <mark>cluster_demo<\/mark>\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u8fdb\u5165\u8be5\u76ee\u5f55\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token builtin class-name\">cd<\/span> <mark>cluster_demo<\/mark>\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u7136\u540e\uff0c\u521d\u59cb\u5316\u9879\u76ee\uff0c\u8fd9\u5c06\u540c\u65f6\u521b\u5efa\u4e00\u4e2apackage.json\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">npm<\/span> init <span class=\"token parameter variable\">-y<\/span>\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>-y\u9009\u9879\u544a\u8bc9NPM\u63a5\u53d7\u6240\u6709\u9ed8\u8ba4\u9009\u9879\u3002<\/p>\n<p>\u5f53\u547d\u4ee4\u8fd0\u884c\u65f6\uff0c\u5b83\u5c06\u4ea7\u751f\u4e0e\u4ee5\u4e0b\u5339\u914d\u7684\u8f93\u51fa\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa\u5199\u5165 \/home\/<mark>sammy<\/mark>\/<mark>cluster_demo<\/mark>\/package.json:\r\n\r\n{\r\n  \"name\": \"<mark>cluster_demo<\/mark>\",\r\n  \"version\": \"1.0.0\",\r\n  \"description\": \"\",\r\n  \"main\": \"index.js\",\r\n  \"scripts\": {\r\n    \"test\": \"echo \\\"Error: no test specified\\\" &amp;&amp; exit 1\"\r\n  },\r\n  \"keywords\": [],\r\n  \"author\": \"\",\r\n  \"license\": \"ISC\"\r\n}\r\n<\/code><\/pre>\n<p>\u6ce8\u610f\u8fd9\u4e9b\u4e0e\u60a8\u7684\u7279\u5b9a\u9879\u76ee\u5bf9\u9f50\u7684\u5c5e\u6027\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>name\uff1anpm\u5305\u7684\u540d\u79f0\u3002<\/li>\n<li>version\uff1a\u60a8\u7684\u5305\u7684\u7248\u672c\u53f7\u3002<\/li>\n<li>main\uff1a\u60a8\u9879\u76ee\u7684\u5165\u53e3\u70b9\u3002<\/li>\n<\/ul>\n<p>\u8981\u4e86\u89e3\u5176\u4ed6\u5c5e\u6027\u7684\u66f4\u591a\u4fe1\u606f\uff0c\u60a8\u53ef\u4ee5\u67e5\u770bNPM\u6587\u6863\u4e2d\u7684package.json\u90e8\u5206\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u4f7f\u7528\u60a8\u559c\u6b22\u7684\u7f16\u8f91\u5668\u6253\u5f00package.json\u6587\u4ef6\uff08\u672c\u6559\u7a0b\u5c06\u4f7f\u7528nano\uff09\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">nano<\/span> package.json\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u5728\u60a8\u7684package.json\u6587\u4ef6\u4e2d\uff0c\u6dfb\u52a0\u9ad8\u4eae\u6587\u672c\u4ee5\u542f\u7528\u5bf9ES\u6a21\u5757\u5bfc\u5165\u7684\u652f\u6301\uff1a<\/p>\n<div>cluster_demo\/package.json<\/p>\n<pre class=\"post-pre\"><code><span class=\"token punctuation\">{<\/span>\r\n  ...\r\n  <span class=\"token property\">\"author\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"\"<\/span><span class=\"token punctuation\">,<\/span>\r\n  <span class=\"token property\">\"license\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"ISC\"<\/span><mark><span class=\"token punctuation\">,<\/span><\/mark>\r\n  <mark><span class=\"token property\">\"type\"<\/span><span class=\"token operator\">:<\/span> <span class=\"token string\">\"module\"<\/span><\/mark>\r\n<span class=\"token punctuation\">}<\/span>\r\n<\/code><\/pre>\n<p>\u4f7f\u7528CTRL+X\u4fdd\u5b58\u5e76\u5173\u95ed\u6587\u4ef6\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u60a8\u5c06\u4e0b\u8f7d\u4ee5\u4e0b\u8f6f\u4ef6\u5305\uff1a<\/p>\n<ul class=\"post-ul\">\n<li>express\uff1a\u4e00\u4e2a\u7528\u4e8e\u5728Node.js\u4e2d\u6784\u5efaWeb\u5e94\u7528\u7a0b\u5e8f\u7684\u6846\u67b6\u3002<\/li>\n<li>loadtest\uff1a\u4e00\u4e2a\u8d1f\u8f7d\u6d4b\u8bd5\u5de5\u5177\uff0c\u7528\u4e8e\u751f\u6210\u6d41\u91cf\u4ee5\u6d4b\u91cf\u5e94\u7528\u7a0b\u5e8f\u7684\u6027\u80fd\u3002<\/li>\n<li>pm2\uff1a\u4e00\u4e2a\u5c06\u5e94\u7528\u7a0b\u5e8f\u81ea\u52a8\u6269\u5c55\u5230\u591a\u4e2aCPU\u7684\u5de5\u5177\u3002<\/li>\n<\/ul>\n<p>\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\u4e0b\u8f7dExpress\u8f6f\u4ef6\u5305\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> express\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u8fd0\u884c\u547d\u4ee4\u5168\u5c40\u4e0b\u8f7dloadtest\u548cpm2\u8f6f\u4ef6\u5305\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">npm<\/span> <span class=\"token function\">install<\/span> <span class=\"token parameter variable\">-g<\/span> loadtest pm2\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u65e2\u7136\u60a8\u5df2\u7ecf\u5b89\u88c5\u4e86\u5fc5\u8981\u7684\u4f9d\u8d56\u9879\uff0c\u60a8\u5c06\u521b\u5efa\u4e00\u4e2a\u4e0d\u4f7f\u7528\u96c6\u7fa4\u7684\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<h2>\u6b65\u9aa42 \u2014 \u521b\u5efa\u4e0d\u4f7f\u7528\u96c6\u7fa4\u7684\u5e94\u7528\u7a0b\u5e8f<\/h2>\n<p>\u5728\u6b64\u6b65\u9aa4\u4e2d\uff0c\u60a8\u5c06\u521b\u5efa\u4e00\u4e2a\u5305\u542b\u5355\u4e2a\u8def\u7531\u7684\u793a\u4f8b\u7a0b\u5e8f\uff0c\u8be5\u7a0b\u5e8f\u5c06\u5728\u6bcf\u6b21\u7528\u6237\u8bbf\u95ee\u65f6\u542f\u52a8CPU\u5bc6\u96c6\u578b\u4efb\u52a1\u3002\u8be5\u7a0b\u5e8f\u4e0d\u4f1a\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\uff0c\u4ee5\u4fbf\u60a8\u53ef\u4ee5\u4e86\u89e3\u5728\u5355\u4e2aCPU\u4e0a\u8fd0\u884c\u5355\u4e2a\u5e94\u7528\u7a0b\u5e8f\u5b9e\u4f8b\u7684\u6027\u80fd\u5f71\u54cd\u3002\u7a0d\u540e\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u60a8\u5c06\u8fd9\u79cd\u65b9\u6cd5\u4e0e\u96c6\u7fa4\u6a21\u5757\u7684\u6027\u80fd\u8fdb\u884c\u6bd4\u8f83\u3002<\/p>\n<p>\u4f7f\u7528nano\u6216\u60a8\u559c\u6b22\u7684\u6587\u672c\u7f16\u8f91\u5668\uff0c\u521b\u5efaindex.js\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">nano<\/span> index.js\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u5728\u60a8\u7684index.js\u6587\u4ef6\u4e2d\uff0c\u6dfb\u52a0\u4ee5\u4e0b\u884c\u4ee5\u5bfc\u5165\u5e76\u5b9e\u4f8b\u5316Express\uff1a<\/p>\n<div>cluster_demo\/index.js<\/p>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">import<\/span> express <span class=\"token keyword\">from<\/span> <span class=\"token string\">\"express\"<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> port <span class=\"token operator\">=<\/span> <span class=\"token number\">3000<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">const<\/span> app <span class=\"token operator\">=<\/span> <span class=\"token function\">express<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\nconsole<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token string\">worker pid=<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>process<span class=\"token punctuation\">.<\/span>pid<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<\/div>\n<p>\u5728\u7b2c\u4e00\u884c\u4e2d\uff0c\u60a8\u5bfc\u5165\u4e86express\u8f6f\u4ef6\u5305\u3002\u5728\u7b2c\u4e8c\u884c\u4e2d\uff0c\u60a8\u5c06port\u53d8\u91cf\u8bbe\u7f6e\u4e3a\u7aef\u53e33000\uff0c\u5e94\u7528\u7a0b\u5e8f\u7684\u670d\u52a1\u5668\u5c06\u5728\u6b64\u7aef\u53e3\u4e0a\u76d1\u542c\u3002\u63a5\u4e0b\u6765\uff0c\u60a8\u5c06app\u53d8\u91cf\u8bbe\u7f6e\u4e3aExpress\u7684\u5b9e\u4f8b\u3002\u4e4b\u540e\uff0c\u60a8\u4f7f\u7528\u5185\u7f6e\u7684process\u6a21\u5757\u5728\u63a7\u5236\u53f0\u4e2d\u8bb0\u5f55\u5e94\u7528\u7a0b\u5e8f\u8fdb\u7a0b\u7684\u8fdb\u7a0bID\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u6dfb\u52a0\u8fd9\u4e9b\u884c\u6765\u5b9a\u4e49\/heavy\u8def\u7531\uff0c\u8be5\u8def\u7531\u5c06\u5305\u542b\u4e00\u4e2aCPU\u5bc6\u96c6\u578b\u5faa\u73af\uff1a<\/p>\n<div>cluster_demo\/index.js<\/p>\n<pre class=\"post-pre\"><code><span class=\"token operator\">...<\/span>\r\napp<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/heavy\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">req<span class=\"token punctuation\">,<\/span> res<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">let<\/span> total <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">let<\/span> i <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">5_000_000<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">++<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n    total<span class=\"token operator\">++<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n  res<span class=\"token punctuation\">.<\/span><span class=\"token function\">send<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token string\">CPU\u5bc6\u96c6\u578b\u4efb\u52a1\u7684\u7ed3\u679c\u662f <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>total<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\">\\n<\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<p>\u5728 \/heavy \u8def\u7531\u4e2d\uff0c\u60a8\u5b9a\u4e49\u4e86\u4e00\u4e2a\u5faa\u73af\uff0c\u5c06 total \u53d8\u91cf\u9012\u589e500\u4e07\u6b21\u3002\u7136\u540e\uff0c\u60a8\u4f7f\u7528 res.send() \u65b9\u6cd5\u53d1\u9001\u4e00\u4e2a\u5305\u542b total \u53d8\u91cf\u503c\u7684\u54cd\u5e94\u3002\u867d\u7136\u8fd9\u4e2aCPU\u5bc6\u96c6\u578b\u4efb\u52a1\u7684\u793a\u4f8b\u662f\u4efb\u610f\u7684\uff0c\u4f46\u5b83\u5c55\u793a\u4e86CPU\u5bc6\u96c6\u578b\u4efb\u52a1\u800c\u4e0d\u4f1a\u589e\u52a0\u590d\u6742\u6027\u3002\u60a8\u4e5f\u53ef\u4ee5\u4e3a\u8def\u7531\u4f7f\u7528\u5176\u4ed6\u540d\u79f0\uff0c\u4f46\u672c\u6559\u7a0b\u4f7f\u7528 \/heavy \u6765\u8868\u793a\u4e00\u4e2a\u6027\u80fd\u7e41\u91cd\u7684\u4efb\u52a1\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u8c03\u7528Express\u6a21\u5757\u7684listen()\u65b9\u6cd5\uff0c\u4f7f\u670d\u52a1\u5668\u76d1\u542c\u5b58\u50a8\u5728port\u53d8\u91cf\u4e2d\u7684\u7aef\u53e33000\uff1a<\/p>\n<div>cluster_demo\/index.js<\/div>\n<pre class=\"post-pre\"><code><span class=\"token operator\">...<\/span>\r\napp<span class=\"token punctuation\">.<\/span><span class=\"token function\">listen<\/span><span class=\"token punctuation\">(<\/span>port<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n  console<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token string\">\u5e94\u7528\u7a0b\u5e8f\u6b63\u5728\u76d1\u542c\u7aef\u53e3 <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>port<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<p>\u5b8c\u6574\u6587\u4ef6\u5c06\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<div>cluster_demo\/index.js<\/div>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">import<\/span> express <span class=\"token keyword\">from<\/span> <span class=\"token string\">\"express\"<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> port <span class=\"token operator\">=<\/span> <span class=\"token number\">3000<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">const<\/span> app <span class=\"token operator\">=<\/span> <span class=\"token function\">express<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\nconsole<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token string\">worker pid=<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>process<span class=\"token punctuation\">.<\/span>pid<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\napp<span class=\"token punctuation\">.<\/span><span class=\"token function\">get<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\/heavy\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">req<span class=\"token punctuation\">,<\/span> res<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token keyword\">let<\/span> total <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">let<\/span> i <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> <span class=\"token number\">5_000_000<\/span><span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">++<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n    total<span class=\"token operator\">++<\/span><span class=\"token punctuation\">;<\/span>\r\n  <span class=\"token punctuation\">}<\/span>\r\n  res<span class=\"token punctuation\">.<\/span><span class=\"token function\">send<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token string\">The result of the CPU intensive task is <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>total<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\">\\n<\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\napp<span class=\"token punctuation\">.<\/span><span class=\"token function\">listen<\/span><span class=\"token punctuation\">(<\/span>port<span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n  console<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token string\">App listening on port <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>port<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<p>\u5b8c\u6210\u4ee3\u7801\u6dfb\u52a0\u540e\uff0c\u4fdd\u5b58\u5e76\u9000\u51fa\u6587\u4ef6\u3002\u7136\u540e\u4f7f\u7528node\u547d\u4ee4\u8fd0\u884c\u8be5\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">node<\/span> index.js<\/li><\/ol><\/code><\/pre>\n<p>\u8fd0\u884c\u8be5\u547d\u4ee4\u540e\uff0c\u8f93\u51fa\u5c06\u5982\u4e0b\u6240\u793a\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51faworker pid=11023\r\nApp listening on port 3000<\/div><\/code><\/pre>\n<p>\u8f93\u51fa\u4e86\u6b63\u5728\u8fd0\u884c\u7684\u8fdb\u7a0bID\u4ee5\u53ca\u786e\u8ba4\u670d\u52a1\u5668\u6b63\u5728\u76d1\u542c\u7aef\u53e33000\u7684\u6d88\u606f\u3002<\/p>\n<p>\u8981\u6d4b\u8bd5\u5e94\u7528\u7a0b\u5e8f\u662f\u5426\u6b63\u5e38\u5de5\u4f5c\uff0c\u8bf7\u6253\u5f00\u53e6\u4e00\u4e2a\u7ec8\u7aef\u5e76\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">curl<\/span> http:\/\/localhost:3000\/heavy\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<div class=\"post-conf-note\">\n<p class=\"post-note\">\n<p class=\"post-conf-desc\">\u6ce8\u610f\uff1a<\/p>\n<\/div>\n<p>\u5982\u679c\u60a8\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u6309\u7167\u672c\u6559\u7a0b\u64cd\u4f5c\uff0c\u8bf7\u6253\u5f00\u53e6\u4e00\u4e2a\u7ec8\u7aef\uff0c\u7136\u540e\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<pre class=\"post-pre\"><code>ssh -L 3000:localhost:3000 your_non_root_user@your_server_ip<\/code><\/pre>\n<p>\u8fde\u63a5\u540e\uff0c\u8f93\u5165\u4ee5\u4e0b\u547d\u4ee4\u4f7f\u7528curl\u5411\u5e94\u7528\u53d1\u9001\u8bf7\u6c42\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">curl<\/span> http:\/\/localhost:3000\/heavy\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u8f93\u51fa\u5c06\u5339\u914d\u4ee5\u4e0b\u5185\u5bb9\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa\r\nThe result of the CPU intensive task is 5000000<\/div>\r\n<\/code><\/pre>\n<p>\u8f93\u51fa\u6765\u81eaCPU\u5bc6\u96c6\u578b\u8ba1\u7b97\u7684\u7ed3\u679c\u3002<\/p>\n<p>\u6b64\u65f6\uff0c\u60a8\u53ef\u4ee5\u4f7f\u7528CTRL+C\u505c\u6b62\u670d\u52a1\u5668\u3002<\/p>\n<p>\u5f53\u60a8\u4f7f\u7528node\u547d\u4ee4\u8fd0\u884cindex.js\u6587\u4ef6\u65f6\uff0c\u64cd\u4f5c\u7cfb\u7edf\uff08OS\uff09\u4f1a\u521b\u5efa\u4e00\u4e2a\u8fdb\u7a0b\u3002\u8fdb\u7a0b\u662f\u64cd\u4f5c\u7cfb\u7edf\u4e3a\u6b63\u5728\u8fd0\u884c\u7684\u7a0b\u5e8f\u521b\u5efa\u7684\u62bd\u8c61\u3002\u64cd\u4f5c\u7cfb\u7edf\u4e3a\u7a0b\u5e8f\u5206\u914d\u5185\u5b58\uff0c\u5e76\u5728\u5305\u542b\u6240\u6709\u64cd\u4f5c\u7cfb\u7edf\u8fdb\u7a0b\u7684\u8fdb\u7a0b\u5217\u8868\u4e2d\u521b\u5efa\u4e00\u4e2a\u6761\u76ee\u3002\u8be5\u6761\u76ee\u5c31\u662f\u4e00\u4e2a\u8fdb\u7a0bID\u3002<\/p>\n<p>\u7136\u540e\uff0c\u7a0b\u5e8f\u4e8c\u8fdb\u5236\u6587\u4ef6\u88ab\u5b9a\u4f4d\u5e76\u52a0\u8f7d\u5230\u5206\u914d\u7ed9\u8fdb\u7a0b\u7684\u5185\u5b58\u4e2d\u3002\u4ece\u90a3\u91cc\u5f00\u59cb\u6267\u884c\u3002\u5728\u8fd0\u884c\u8fc7\u7a0b\u4e2d\uff0c\u5b83\u4e0d\u77e5\u9053\u7cfb\u7edf\u4e2d\u7684\u5176\u4ed6\u8fdb\u7a0b\uff0c\u8fdb\u7a0b\u4e2d\u53d1\u751f\u7684\u4efb\u4f55\u4e8b\u60c5\u90fd\u4e0d\u4f1a\u5f71\u54cd\u5176\u4ed6\u8fdb\u7a0b\u3002<\/p>\n<p>\u7531\u4e8e\u60a8\u7684Node.js\u5e94\u7528\u7a0b\u5e8f\u5728\u5177\u6709\u591a\u4e2aCPU\u7684\u670d\u52a1\u5668\u4e0a\u53ea\u8fd0\u884c\u4e00\u4e2a\u8fdb\u7a0b\uff0c\u5b83\u5c06\u63a5\u6536\u548c\u5904\u7406\u6240\u6709\u4f20\u5165\u7684\u8bf7\u6c42\u3002\u5728\u6b64\u56fe\u4e2d\uff0c\u6240\u6709\u4f20\u5165\u7684\u8bf7\u6c42\u90fd\u5b9a\u5411\u5230\u5728\u5355\u4e2aCPU\u4e0a\u8fd0\u884c\u7684\u8fdb\u7a0b\uff0c\u800c\u5176\u4ed6CPU\u4fdd\u6301\u7a7a\u95f2\u72b6\u6001\uff1a<\/p>\n<div>\n                            <img decoding=\"async\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/6564488431a79a2e24944726\/68-0.png\" class='post-images' alt=\"\u663e\u793a\u4e00\u4e2a\u8fdb\u7a0b\u5728\u5177\u6709\u56db\u4e2aCPU\u7684\u673a\u5668\u7684\u4e00\u4e2aCPU\u4e0a\u8fd0\u884c\uff0c\u5904\u7406\u6240\u6709\u4f20\u5165\u8bf7\u6c42\u7684\u56fe\u8868\" title=\"\">\n                        <\/div>\n<p>\u73b0\u5728\u60a8\u5df2\u7ecf\u521b\u5efa\u4e86\u4e00\u4e2a\u4e0d\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\u7684\u5e94\u7528\u7a0b\u5e8f\uff0c\u63a5\u4e0b\u6765\u60a8\u5c06\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\u6765\u6269\u5c55\u5e94\u7528\u7a0b\u5e8f\u4ee5\u4f7f\u7528\u591a\u4e2aCPU\u3002<\/p>\n<h2>\u6b65\u9aa4 3 \u2014 \u96c6\u7fa4\u5316\u5e94\u7528\u7a0b\u5e8f<\/h2>\n<p>\u5728\u8fd9\u4e00\u6b65\u4e2d\uff0c\u60a8\u5c06\u6dfb\u52a0\u96c6\u7fa4\u6a21\u5757\u4ee5\u521b\u5efa\u540c\u4e00\u7a0b\u5e8f\u7684\u591a\u4e2a\u5b9e\u4f8b\uff0c\u4ee5\u5904\u7406\u66f4\u591a\u8d1f\u8f7d\u5e76\u63d0\u9ad8\u6027\u80fd\u3002\u5f53\u60a8\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\u8fd0\u884c\u8fdb\u7a0b\u65f6\uff0c\u60a8\u53ef\u4ee5\u5728\u673a\u5668\u7684\u6bcf\u4e2aCPU\u4e0a\u8fd0\u884c\u591a\u4e2a\u8fdb\u7a0b\uff1a<\/p>\n<div>\n                            <img decoding=\"async\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/6564488431a79a2e24944726\/72-0.png\" class='post-images' alt=\"\u5177\u6709\u56db\u4e2aCPU\u7684\u673a\u5668\u7684\u6bcf\u4e2aCPU\u4e0a\u8fd0\u884c\u7684\u8fdb\u7a0b\u5171\u4eab\u8d1f\u8f7d\u7684\u5c4f\u5e55\u622a\u56fe\" title=\"\">\n                        <\/div>\n<p>\u5728\u6b64\u56fe\u4e2d\uff0c\u8bf7\u6c42\u901a\u8fc7\u4e3b\u8fdb\u7a0b\u4e2d\u7684\u8d1f\u8f7d\u5747\u8861\u5668\uff0c\u7136\u540e\u4f7f\u7528\u8f6e\u8be2\u7b97\u6cd5\u5728\u8fdb\u7a0b\u4e4b\u95f4\u5206\u914d\u8bf7\u6c42\u3002<\/p>\n<p>\u73b0\u5728\u60a8\u5c06\u6dfb\u52a0\u96c6\u7fa4\u6a21\u5757\u3002\u5728\u60a8\u7684\u7ec8\u7aef\u4e2d\uff0c\u521b\u5efaprimary.js\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">nano<\/span> primary.js\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u5728\u60a8\u7684primary.js\u6587\u4ef6\u4e2d\uff0c\u6dfb\u52a0\u4ee5\u4e0b\u884c\u6765\u5bfc\u5165\u4f9d\u8d56\u9879\uff1a<\/p>\n<div>cluster_demo\/primary.js<\/p>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">import<\/span> cluster <span class=\"token keyword\">from<\/span> <span class=\"token string\">\"cluster\"<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> os <span class=\"token keyword\">from<\/span> <span class=\"token string\">\"os\"<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> dirname <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">\"path\"<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> fileURLToPath <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">\"url\"<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> __dirname <span class=\"token operator\">=<\/span> <span class=\"token function\">dirname<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">fileURLToPath<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">import<\/span><span class=\"token punctuation\">.<\/span>meta<span class=\"token punctuation\">.<\/span>url<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u524d\u4e24\u884c\u4e2d\uff0c\u60a8\u5bfc\u5165\u4e86cluster\u548cos\u6a21\u5757\u3002\u5728\u63a5\u4e0b\u6765\u7684\u4e24\u884c\u4e2d\uff0c\u60a8\u5bfc\u5165\u4e86dirname\u548cfileURLToPath\uff0c\u5b83\u4eec\u7528\u4e8e\u5c06__dirname\u53d8\u91cf\u503c\u8bbe\u7f6e\u4e3a\u6267\u884cindex.js\u6587\u4ef6\u7684\u76ee\u5f55\u7684\u7edd\u5bf9\u8def\u5f84\u3002\u8fd9\u4e9b\u5bfc\u5165\u662f\u5fc5\u8981\u7684\uff0c\u56e0\u4e3a\u5728\u4f7f\u7528ES\u6a21\u5757\u65f6\u672a\u5b9a\u4e49__dirname\uff0c\u5b83\u4ec5\u5728CommonJS\u6a21\u5757\u4e2d\u9ed8\u8ba4\u5b9a\u4e49\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u6dfb\u52a0\u4ee5\u4e0b\u4ee3\u7801\u6765\u5f15\u7528index.js\u6587\u4ef6\uff1a<\/p>\n<div>cluster_demo\/primary.js<\/div>\n<pre class=\"post-pre\"><code><span class=\"token operator\">...<\/span>\r\n<span class=\"token keyword\">const<\/span> cpuCount <span class=\"token operator\">=<\/span> os<span class=\"token punctuation\">.<\/span><span class=\"token function\">cpus<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>length<span class=\"token punctuation\">;<\/span>\r\n\r\nconsole<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token string\">The total number of CPUs is <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>cpuCount<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\nconsole<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token string\">Primary pid=<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>process<span class=\"token punctuation\">.<\/span>pid<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\ncluster<span class=\"token punctuation\">.<\/span><span class=\"token function\">setupPrimary<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token literal-property property\">exec<\/span><span class=\"token operator\">:<\/span> __dirname <span class=\"token operator\">+<\/span> <span class=\"token string\">\"\/index.js\"<\/span><span class=\"token punctuation\">,<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<p>\u9996\u5148\uff0c\u60a8\u5c06cpuCount\u53d8\u91cf\u8bbe\u7f6e\u4e3a\u673a\u5668\u4e2d\u7684CPU\u6570\u91cf\uff0c\u8be5\u6570\u91cf\u5e94\u8be5\u4e3a\u56db\u4e2a\u6216\u66f4\u9ad8\u3002\u63a5\u4e0b\u6765\uff0c\u60a8\u5728\u63a7\u5236\u53f0\u4e2d\u8bb0\u5f55CPU\u7684\u6570\u91cf\u3002\u7136\u540e\uff0c\u60a8\u8bb0\u5f55\u4e3b\u8fdb\u7a0b\u7684\u8fdb\u7a0bID\uff0c\u8be5\u8fdb\u7a0b\u5c06\u63a5\u6536\u6240\u6709\u8bf7\u6c42\uff0c\u5e76\u4f7f\u7528\u8d1f\u8f7d\u5747\u8861\u5668\u5c06\u5b83\u4eec\u5206\u914d\u7ed9\u5de5\u4f5c\u8fdb\u7a0b\u3002<\/p>\n<p>\u4e4b\u540e\uff0c\u60a8\u4f7f\u7528cluster\u6a21\u5757\u7684setupPrimary()\u65b9\u6cd5\u5f15\u7528index.js\u6587\u4ef6\uff0c\u4ee5\u4fbf\u5728\u6bcf\u4e2a\u751f\u6210\u7684\u5de5\u4f5c\u8fdb\u7a0b\u4e2d\u6267\u884c\u5b83\u3002<\/p>\n<p>\u63a5\u4e0b\u6765\uff0c\u6dfb\u52a0\u4ee5\u4e0b\u4ee3\u7801\u6765\u521b\u5efa\u8fdb\u7a0b\uff1a<\/p>\n<div>cluster_demo\/primary.js<\/div>\n<pre class=\"post-pre\"><code><span class=\"token operator\">...<\/span>\r\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">let<\/span> i <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> cpuCount<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">++<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  cluster<span class=\"token punctuation\">.<\/span><span class=\"token function\">fork<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\ncluster<span class=\"token punctuation\">.<\/span><span class=\"token function\">on<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"exit\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">worker<span class=\"token punctuation\">,<\/span> code<span class=\"token punctuation\">,<\/span> signal<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n  console<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token string\">\u5de5\u4f5c\u8fdb\u7a0b <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>worker<span class=\"token punctuation\">.<\/span>process<span class=\"token punctuation\">.<\/span>pid<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\"> \u5df2\u88ab\u7ec8\u6b62<\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  console<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\u6b63\u5728\u542f\u52a8\u65b0\u7684\u5de5\u4f5c\u8fdb\u7a0b\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  cluster<span class=\"token punctuation\">.<\/span><span class=\"token function\">fork<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<p>\u8be5\u5faa\u73af\u4f1a\u8fed\u4ee3cpuCount\u503c\u7684\u6b21\u6570\uff0c\u5e76\u5728\u6bcf\u6b21\u8fed\u4ee3\u4e2d\u8c03\u7528cluster\u6a21\u5757\u7684fork()\u65b9\u6cd5\u3002\u60a8\u4f7f\u7528cluster\u6a21\u5757\u7684on()\u65b9\u6cd5\u9644\u52a0exit\u4e8b\u4ef6\uff0c\u4ee5\u76d1\u542c\u8fdb\u7a0b\u4f55\u65f6\u53d1\u51faexit\u4e8b\u4ef6\uff0c\u8fd9\u901a\u5e38\u53d1\u751f\u5728\u8fdb\u7a0b\u7ec8\u6b62\u65f6\u3002\u5f53exit\u4e8b\u4ef6\u88ab\u89e6\u53d1\u65f6\uff0c\u60a8\u4f1a\u8bb0\u5f55\u5df2\u7ec8\u6b62\u7684\u5de5\u4f5c\u8fdb\u7a0b\u7684\u8fdb\u7a0bID\uff0c\u7136\u540e\u8c03\u7528fork()\u65b9\u6cd5\u521b\u5efa\u4e00\u4e2a\u65b0\u7684\u5de5\u4f5c\u8fdb\u7a0b\u6765\u66ff\u6362\u5df2\u7ec8\u6b62\u7684\u8fdb\u7a0b\u3002<\/p>\n<p>\u60a8\u7684\u5b8c\u6574\u4ee3\u7801\u73b0\u5728\u5c06\u4e0e\u4ee5\u4e0b\u5185\u5bb9\u5339\u914d\uff1a<\/p>\n<div>cluster_demo\/primary.js<\/div>\n<pre class=\"post-pre\"><code><span class=\"token keyword\">import<\/span> cluster <span class=\"token keyword\">from<\/span> <span class=\"token string\">\"cluster\"<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> os <span class=\"token keyword\">from<\/span> <span class=\"token string\">\"os\"<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> dirname <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">\"path\"<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token keyword\">import<\/span> <span class=\"token punctuation\">{<\/span> fileURLToPath <span class=\"token punctuation\">}<\/span> <span class=\"token keyword\">from<\/span> <span class=\"token string\">\"url\"<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> __dirname <span class=\"token operator\">=<\/span> <span class=\"token function\">dirname<\/span><span class=\"token punctuation\">(<\/span><span class=\"token function\">fileURLToPath<\/span><span class=\"token punctuation\">(<\/span><span class=\"token keyword\">import<\/span><span class=\"token punctuation\">.<\/span>meta<span class=\"token punctuation\">.<\/span>url<span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">const<\/span> cpuCount <span class=\"token operator\">=<\/span> os<span class=\"token punctuation\">.<\/span><span class=\"token function\">cpus<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">.<\/span>length<span class=\"token punctuation\">;<\/span>\r\n\r\nconsole<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token string\">CPU\u603b\u6570\u4e3a <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>cpuCount<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\nconsole<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token string\">\u4e3b\u8fdb\u7a0bpid=<\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>process<span class=\"token punctuation\">.<\/span>pid<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\ncluster<span class=\"token punctuation\">.<\/span><span class=\"token function\">setupPrimary<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">{<\/span>\r\n  <span class=\"token literal-property property\">exec<\/span><span class=\"token operator\">:<\/span> __dirname <span class=\"token operator\">+<\/span> <span class=\"token string\">\"\/index.js\"<\/span><span class=\"token punctuation\">,<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n\r\n<span class=\"token keyword\">for<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token keyword\">let<\/span> i <span class=\"token operator\">=<\/span> <span class=\"token number\">0<\/span><span class=\"token punctuation\">;<\/span> i <span class=\"token operator\">&lt;<\/span> cpuCount<span class=\"token punctuation\">;<\/span> i<span class=\"token operator\">++<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token punctuation\">{<\/span>\r\n  cluster<span class=\"token punctuation\">.<\/span><span class=\"token function\">fork<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span>\r\ncluster<span class=\"token punctuation\">.<\/span><span class=\"token function\">on<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"exit\"<\/span><span class=\"token punctuation\">,<\/span> <span class=\"token punctuation\">(<\/span><span class=\"token parameter\">worker<span class=\"token punctuation\">,<\/span> code<span class=\"token punctuation\">,<\/span> signal<\/span><span class=\"token punctuation\">)<\/span> <span class=\"token operator\">=&gt;<\/span> <span class=\"token punctuation\">{<\/span>\r\n  console<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token template-string\"><span class=\"token template-punctuation string\">`<\/span><span class=\"token string\">\u5de5\u4f5c\u8fdb\u7a0b <\/span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${<\/span>worker<span class=\"token punctuation\">.<\/span>process<span class=\"token punctuation\">.<\/span>pid<span class=\"token interpolation-punctuation punctuation\">}<\/span><\/span><span class=\"token string\"> \u5df2\u88ab\u7ec8\u6b62<\/span><span class=\"token template-punctuation string\">`<\/span><\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  console<span class=\"token punctuation\">.<\/span><span class=\"token function\">log<\/span><span class=\"token punctuation\">(<\/span><span class=\"token string\">\"\u6b63\u5728\u542f\u52a8\u65b0\u7684\u5de5\u4f5c\u8fdb\u7a0b\"<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n  cluster<span class=\"token punctuation\">.<\/span><span class=\"token function\">fork<\/span><span class=\"token punctuation\">(<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<span class=\"token punctuation\">}<\/span><span class=\"token punctuation\">)<\/span><span class=\"token punctuation\">;<\/span>\r\n<\/code><\/pre>\n<p>\u5b8c\u6210\u6dfb\u52a0\u8fd9\u4e9b\u4ee3\u7801\u884c\u540e\uff0c\u4fdd\u5b58\u5e76\u9000\u51fa\u6587\u4ef6\u3002<\/p>\n<p>Next, run the file:<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">node<\/span> primary.js\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>The output will closely match the following (your process IDs and order of information may differ):<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"Output\">OutputThe total number of CPUs is 4\r\nPrimary pid=7341\r\nworker pid=7353\r\nworker pid=7354\r\nworker pid=7360\r\nApp listening on port 3000\r\nApp listening on port 3000\r\nApp listening on port 3000\r\nworker pid=7352\r\nApp listening on port 3000\r\n<\/code><\/pre>\n<p>The output will indicate four CPUs, one primary process that includes a load balancer, and four worker processes listening on port 3000.<\/p>\n<p>Next, return to the second terminal, then send a request to the \/heavy route:<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">curl<\/span> http:\/\/localhost:3000\/heavy\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>The output confirms the program is working:<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"Output\">OutputThe result of the CPU intensive task is 5000000\r\n<\/code><\/pre>\n<p>You can stop the server now.<\/p>\n<p>At this point, you will have four processes running on all the CPUs on your machine:<\/p>\n<div>\n                            <img decoding=\"async\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/6564488431a79a2e24944726\/104-0.png\" class='post-images' alt=\"Screenshot of processes running on each CPU of a machine that has four CPUs sharing load\" title=\"\"><\/p>\n<p>With clustering added to the application, you can compare the program performances for the one using the cluster module and the one without the cluster module.<\/p>\n<h2>Step 4 \u2014 Comparing Performance Using a Load Testing Tool<\/p>\n<p>In this step, you will use the loadtest package to generate traffic against the two programs you\u2019ve built. You\u2019ll compare the performance of the primary.js program which uses the cluster module with that of the index.js program which does not use clustering. You will notice that the program using the cluster module performs faster and can handle more requests within a specific time than the program that doesn\u2019t use clustering.<\/p>\n<p>First, you will measure the performance of the index.js file, which doesn\u2019t use the cluster module and only runs on a single instance.<\/p>\n<p>In your first terminal, run the index.js file to start the server:<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">node<\/span> index.js\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>You\u2019ll receive an output that the app is running:<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"Output\">Outputworker pid=7731\r\nApp listening on port 3000\r\n<\/code><\/pre>\n<p>Next, return to your second terminal to use the loadtest package to send requests to the server:<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">loadtest <span class=\"token parameter variable\">-n<\/span> <span class=\"token number\">1200<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token number\">200<\/span> <span class=\"token parameter variable\">-k<\/span> http:\/\/localhost:3000\/heavy\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>The -n option accepts the number of requests the package should send, which is 1200 requests here. The -c option accepts the number of requests that should be sent simultaneously to the server.<\/p>\n<p>Once the requests have been sent, the package will return output similar to the following:<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"Output\">OutputRequests: 0 (0%), requests per second: 0, mean latency: 0 ms\r\nRequests: 430 (36%), requests per second: 87, mean latency: 1815.1 ms\r\nRequests: 879 (73%), requests per second: 90, mean latency: 2230.5 ms\r\n\r\nTarget URL:          http:\/\/localhost:3000\/heavy\r\nMax requests:        1200\r\nConcurrency level:   200\r\nAgent:               keepalive\r\n\r\nCompleted requests:  1200\r\nTotal errors:        0\r\nTotal time:          <mark>13.712728601 s<\/mark>\r\nRequests per second: <mark>88<\/mark>\r\nMean latency:        <mark>2085.1 ms<\/mark>\r\n\r\nPercentage of the requests served within a certain time\r\n  50%      2234 ms\r\n  90%      2340 ms\r\n  95%      2385 ms\r\n  99%      2406 ms\r\n 100%      2413 ms (longest request)\r\n<\/code><\/pre>\n<p>From this output, take note of the following metrics:<\/p>\n<ul class=\"post-ul\">\n<li>Total time measures how long it took for all the requests to be served. In this output, it took just over 13 seconds to serve all 1200 requests.<\/li>\n<li>Requests per second measures the number of requests the server can handle per second. In this output, the server handles 88 requests per second.<\/li>\n<li>Mean latency measures the time it took to send a request and get a response, which is 2085.1 ms in the sample output.<\/li>\n<\/ul>\n<p>These metrics will vary depending on your network or processor speed, but they will be close to these examples.<\/p>\n<p>Now that you have measured the performance of the index.js file, you can stop the server.<\/p>\n<p>Next, you will measure the performance of the primary.js file, which uses the cluster module.<\/p>\n<p>\u4e3a\u6b64\uff0c\u8bf7\u8fd4\u56de\u7b2c\u4e00\u4e2a\u7ec8\u7aef\u5e76\u91cd\u65b0\u8fd0\u884cprimary.js\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">node<\/span> primary.js\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u60a8\u5c06\u6536\u5230\u4e0e\u4e4b\u524d\u76f8\u540c\u7684\u4fe1\u606f\u7684\u54cd\u5e94\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51faCPU\u603b\u6570\u4e3a4\r\n\u4e3b\u8fdb\u7a0b pid=7841\r\n\u5de5\u4f5c\u8fdb\u7a0b pid=7852\r\n\u5e94\u7528\u7a0b\u5e8f\u6b63\u5728\u76d1\u542c\u7aef\u53e33000\r\n\u5de5\u4f5c\u8fdb\u7a0b pid=7854\r\n\u5e94\u7528\u7a0b\u5e8f\u6b63\u5728\u76d1\u542c\u7aef\u53e33000\r\n\u5de5\u4f5c\u8fdb\u7a0b pid=7853\r\n\u5de5\u4f5c\u8fdb\u7a0b pid=7860\r\n\u5e94\u7528\u7a0b\u5e8f\u6b63\u5728\u76d1\u542c\u7aef\u53e33000\r\n\u5e94\u7528\u7a0b\u5e8f\u6b63\u5728\u76d1\u542c\u7aef\u53e33000\r\n<\/div><\/code><\/pre>\n<p>\u5728\u7b2c\u4e8c\u4e2a\u7ec8\u7aef\u4e2d\uff0c\u518d\u6b21\u8fd0\u884cloadtest\u547d\u4ee4\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">loadtest <span class=\"token parameter variable\">-n<\/span> <span class=\"token number\">1200<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token number\">200<\/span> <span class=\"token parameter variable\">-k<\/span> http:\/\/localhost:3000\/heavy\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u5f53\u6d4b\u8bd5\u5b8c\u6210\u65f6\uff0c\u60a8\u5c06\u6536\u5230\u7c7b\u4f3c\u7684\u8f93\u51fa\uff08\u53ef\u80fd\u4f1a\u6839\u636e\u60a8\u7cfb\u7edf\u4e0a\u7684CPU\u6570\u91cf\u800c\u6709\u6240\u4e0d\u540c\uff09\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa\u8bf7\u6c42\uff1a0 (0%)\uff0c\u6bcf\u79d2\u8bf7\u6c42\u6570\uff1a0\uff0c\u5e73\u5747\u5ef6\u8fdf\uff1a0 \u6beb\u79d2\r\n\r\n\u76ee\u6807URL\uff1a          http:\/\/localhost:3000\/heavy\r\n\u6700\u5927\u8bf7\u6c42\u6570\uff1a        1200\r\n\u5e76\u53d1\u7ea7\u522b\uff1a   200\r\n\u4ee3\u7406\uff1a               keepalive\r\n\r\n\u5df2\u5b8c\u6210\u8bf7\u6c42\uff1a  1200\r\n\u603b\u9519\u8bef\u6570\uff1a        0\r\n\u603b\u65f6\u95f4\uff1a          <mark>3.412741962 \u79d2<\/mark>\r\n\u6bcf\u79d2\u8bf7\u6c42\u6570\uff1a <mark>352<\/mark>\r\n\u5e73\u5747\u5ef6\u8fdf\uff1a        <mark>514.2 \u6beb\u79d2<\/mark>\r\n\r\n\u5728\u7279\u5b9a\u65f6\u95f4\u5185\u670d\u52a1\u7684\u8bf7\u6c42\u767e\u5206\u6bd4\r\n  50%      194 \u6beb\u79d2\r\n  90%      2521 \u6beb\u79d2\r\n  95%      2699 \u6beb\u79d2\r\n  99%      2710 \u6beb\u79d2\r\n  100%      2759 \u6beb\u79d2\uff08\u6700\u957f\u8bf7\u6c42\uff09\r\n<\/div><\/code><\/pre>\n<p>\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\u8fd0\u884c\u7684primary.js\u5e94\u7528\u7a0b\u5e8f\u7684\u8f93\u51fa\u8868\u660e\uff0c\u603b\u65f6\u95f4\u4ece\u4e0d\u4f7f\u7528\u96c6\u7fa4\u6280\u672f\u7684\u7a0b\u5e8f\u4e2d\u768413\u79d2\u51cf\u5c11\u52303\u79d2\u3002\u670d\u52a1\u5668\u6bcf\u79d2\u53ef\u4ee5\u5904\u7406\u7684\u8bf7\u6c42\u6570\u91cf\u4ece\u4e4b\u524d\u768488\u4e2a\u589e\u52a0\u5230352\u4e2a\uff0c\u589e\u52a0\u4e86\u4e24\u500d\uff0c\u8fd9\u610f\u5473\u7740\u60a8\u7684\u670d\u52a1\u5668\u53ef\u4ee5\u627f\u53d7\u5de8\u5927\u7684\u8d1f\u8f7d\u3002\u53e6\u4e00\u4e2a\u91cd\u8981\u6307\u6807\u662f\u5e73\u5747\u5ef6\u8fdf\uff0c\u5df2\u4ece2085.1\u6beb\u79d2\u663e\u8457\u4e0b\u964d\u5230514.2\u6beb\u79d2\u3002<\/p>\n<p>\u6b64\u54cd\u5e94\u786e\u8ba4\u6269\u5c55\u5df2\u7ecf\u6210\u529f\uff0c\u60a8\u7684\u5e94\u7528\u7a0b\u5e8f\u53ef\u4ee5\u5728\u77ed\u65f6\u95f4\u5185\u5904\u7406\u66f4\u591a\u8bf7\u6c42\u800c\u4e0d\u4f1a\u51fa\u73b0\u5ef6\u8fdf\u3002\u5982\u679c\u60a8\u5347\u7ea7\u673a\u5668\u4ee5\u62e5\u6709\u66f4\u591aCPU\uff0c\u5e94\u7528\u7a0b\u5e8f\u5c06\u81ea\u52a8\u6269\u5c55\u5230CPU\u6570\u91cf\u5e76\u8fdb\u4e00\u6b65\u63d0\u9ad8\u6027\u80fd\u3002<\/p>\n<p>\u63d0\u9192\u4e00\u4e0b\uff0c\u7531\u4e8e\u60a8\u7684\u7f51\u7edc\u548c\u5904\u7406\u5668\u901f\u5ea6\u4e0d\u540c\uff0c\u7ec8\u7aef\u8f93\u51fa\u4e2d\u7684\u6307\u6807\u4f1a\u6709\u6240\u4e0d\u540c\u3002\u603b\u65f6\u95f4\u548c\u5e73\u5747\u5ef6\u8fdf\u5c06\u663e\u8457\u4e0b\u964d\uff0c\u800c\u603b\u65f6\u95f4\u5c06\u8fc5\u901f\u589e\u52a0\u3002<\/p>\n<p>\u65e2\u7136\u60a8\u5df2\u7ecf\u8fdb\u884c\u4e86\u6bd4\u8f83\u5e76\u6ce8\u610f\u5230\u5e94\u7528\u7a0b\u5e8f\u5728\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\u65f6\u8868\u73b0\u66f4\u597d\uff0c\u60a8\u53ef\u4ee5\u505c\u6b62\u670d\u52a1\u5668\u3002\u5728\u4e0b\u4e00\u6b65\u4e2d\uff0c\u60a8\u5c06\u4f7f\u7528pm2\u66ff\u4ee3\u96c6\u7fa4\u6a21\u5757\u3002<\/p>\n<h2>\u7b2c5\u6b65 \u2014 \u4f7f\u7528pm2\u8fdb\u884c\u96c6\u7fa4\u5316<\/h2>\n<p>\u5230\u76ee\u524d\u4e3a\u6b62\uff0c\u60a8\u5df2\u7ecf\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\u6839\u636e\u673a\u5668\u4e0a\u7684CPU\u6570\u91cf\u521b\u5efa\u5de5\u4f5c\u8fdb\u7a0b\u3002\u60a8\u8fd8\u6dfb\u52a0\u4e86\u5728\u5de5\u4f5c\u8fdb\u7a0b\u5d29\u6e83\u65f6\u91cd\u65b0\u542f\u52a8\u5b83\u7684\u529f\u80fd\u3002\u5728\u8fd9\u4e00\u6b65\u4e2d\uff0c\u60a8\u5c06\u8bbe\u7f6e\u4e00\u4e2a\u66ff\u4ee3\u65b9\u6848\uff0c\u901a\u8fc7\u4f7f\u7528\u57fa\u4e8e\u96c6\u7fa4\u6a21\u5757\u6784\u5efa\u7684pm2\u8fdb\u7a0b\u7ba1\u7406\u5668\u6765\u81ea\u52a8\u6269\u5c55\u5e94\u7528\u7a0b\u5e8f\u3002\u8fd9\u4e2a\u8fdb\u7a0b\u7ba1\u7406\u5668\u5305\u542b\u4e00\u4e2a\u8d1f\u8f7d\u5747\u8861\u5668\uff0c\u53ef\u4ee5\u81ea\u52a8\u521b\u5efa\u4e0e\u673a\u5668\u4e0aCPU\u6570\u91cf\u76f8\u540c\u7684\u5de5\u4f5c\u8fdb\u7a0b\u3002\u5b83\u8fd8\u5141\u8bb8\u60a8\u76d1\u63a7\u8fdb\u7a0b\uff0c\u5e76\u5728\u67d0\u4e2a\u8fdb\u7a0b\u5d29\u6e83\u65f6\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u65b0\u7684\u5de5\u4f5c\u8fdb\u7a0b\u3002<\/p>\n<p>\u8981\u4f7f\u7528\u5b83\uff0c\u60a8\u9700\u8981\u4f7f\u7528\u9700\u8981\u6269\u5c55\u7684\u6587\u4ef6\u8fd0\u884cpm2\u5305\uff0c\u5728\u672c\u6559\u7a0b\u4e2d\u662findex.js\u6587\u4ef6\u3002<\/p>\n<p>\u5728\u60a8\u7684\u521d\u59cb\u7ec8\u7aef\u4e2d\uff0c\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u542f\u52a8pm2\u96c6\u7fa4\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">pm2 start index.js <span class=\"token parameter variable\">-i<\/span> <span class=\"token number\">0<\/span>\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>-i\u9009\u9879\u63a5\u53d7\u60a8\u5e0c\u671bpm2\u521b\u5efa\u7684\u5de5\u4f5c\u8fdb\u7a0b\u6570\u91cf\u3002\u5982\u679c\u4f20\u9012\u53c2\u65700\uff0cpm2\u5c06\u81ea\u52a8\u521b\u5efa\u4e0e\u673a\u5668\u4e0aCPU\u6570\u91cf\u76f8\u540c\u7684\u5de5\u4f5c\u8fdb\u7a0b\u3002<\/p>\n<p>\u8fd0\u884c\u8be5\u547d\u4ee4\u540e\uff0cpm2\u5c06\u5411\u60a8\u663e\u793a\u6709\u5173\u5de5\u4f5c\u8fdb\u7a0b\u7684\u66f4\u591a\u8be6\u7ec6\u4fe1\u606f\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa\r\n<\/div><\/code><\/pre>\n<p>&#8230;<br \/>\n[PM2] Spawning PM2 daemon with pm2_home=\/home\/<mark>sammy<\/mark>\/.pm2<br \/>\n[PM2] PM2 Successfully daemonized<br \/>\n[PM2] Starting \/home\/<mark>sammy<\/mark>\/cluster_demo\/index.js in cluster_mode (0 instance)<br \/>\n[PM2] Done.<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 id  \u2502 name     \u2502 namespace   \u2502 version \u2502 mode    \u2502 pid      \u2502 uptime \u2502 \u21ba    \u2502 status    \u2502 cpu      \u2502 mem      \u2502 user     \u2502 watching \u2502<br \/>\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524<br \/>\n\u2502 0   \u2502 index    \u2502 default     \u2502 1.0.0   \u2502 cluster \u2502 7932     \u2502 0s     \u2502 0    \u2502 online    \u2502 0%       \u2502 54.5mb   \u2502 nod\u2026 \u2502 disabled \u2502<br \/>\n\u2502 1   \u2502 index    \u2502 default     \u2502 1.0.0   \u2502 cluster \u2502 7939     \u2502 0s     \u2502 0    \u2502 online    \u2502 0%       \u2502 50.9mb   \u2502 nod\u2026 \u2502 disabled \u2502<br \/>\n\u2502 2   \u2502 index    \u2502 default     \u2502 1.0.0   \u2502 cluster \u2502 7946     \u2502 0s     \u2502 0    \u2502 online    \u2502 0%       \u2502 51.3mb   \u2502 nod\u2026 \u2502 disabled \u2502<br \/>\n\u2502 3   \u2502 index    \u2502 default     \u2502 1.0.0   \u2502 cluster \u2502 7953     \u2502 0s     \u2502 0    \u2502 online    \u2502 0%       \u2502 47.4mb   \u2502 nod\u2026 \u2502 disabled \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n<\/code><\/p>\n<p>The table contains each worker\u2019s process ID, status, CPU utilization, and memory consumption, which you can use to understand how the processes behave.<\/p>\n<p>When starting the cluster with pm2, the package runs in the background and will automatically restart even when you reboot your system.<\/p>\n<p>If you want to read the logs from the worker processes, you can use the following command:<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">pm2 logs\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>You\u2019ll receive an output of the logs:<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"Output\">Output[TAILING] Tailing last 15 lines for [all] processes (change the value with --lines option)\r\n\/home\/<mark>sammy<\/mark>\/.pm2\/pm2.log last 15 lines:\r\n...\r\nPM2        | 2022-12-25T17:48:37: PM2 log: App [index:3] starting in -cluster mode-\r\nPM2        | 2022-12-25T17:48:37: PM2 log: App [index:3] online\r\n\r\n\/home\/<mark>sammy<\/mark>\/.pm2\/logs\/index-error.log last 15 lines:\r\n\/home\/<mark>sammy<\/mark>\/.pm2\/logs\/index-out.log last 15 lines:\r\n0|index    | worker pid=7932\r\n0|index    | App listening on port 3000\r\n0|index    | worker pid=7953\r\n0|index    | App listening on port 3000\r\n0|index    | worker pid=7946\r\n0|index    | worker pid=7939\r\n0|index    | App listening on port 3000\r\n0|index    | App listening on port 3000\r\n<\/code><\/pre>\n<p>In the last eight lines, the log provides the output from each of the four running worker processes, including the process ID and the port number 3000. This output confirms that all the processes are running.<\/p>\n<p>You can also check the status of the processes using the following command:<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">pm2 <span class=\"token function\">ls<\/span>\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>The output will match the following table:<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"Output\">Output\u250c\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u2502 id  \u2502 name     \u2502 namespace   \u2502 version \u2502 mode    \u2502 pid      \u2502 uptime \u2502 \u21ba    \u2502 status    \u2502 cpu      \u2502 mem      \u2502 user     \u2502 watching \u2502\r\n\u251c\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0   \u2502 index    \u2502 default     \u2502 1.0.0   \u2502 cluster \u2502 7932     \u2502 5m     \u2502 0    \u2502 online    \u2502 0%       \u2502 56.6mb   \u2502 nod\u2026 \u2502 disabled \u2502\r\n\u2502 1   \u2502 index    \u2502 default     \u2502 1.0.0   \u2502 cluster \u2502 7939     \u2502 5m     \u2502 0    \u2502 online    \u2502 0%       \u2502 55.7mb   \u2502 nod\u2026 \u2502 disabled \u2502\r\n\u2502 2   \u2502 index    \u2502 default     \u2502 1.0.0   \u2502 cluster \u2502 7946     \u2502 5m     \u2502 0    \u2502 online    \u2502 0%       \u2502 56.5mb   \u2502 nod\u2026 \u2502 disabled \u2502\r\n\u2502 3   \u2502 index    \u2502 default     \u2502 1.0.0   \u2502 cluster \u2502 7953     \u2502 5m     \u2502 0    \u2502 online    \u2502 0%       \u2502 55.9mb   \u2502 nod\u2026 \u2502 disabled \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n<\/code><\/pre>\n<p>Now that the cluster is running, enter the following command in the same terminal to test its performance:<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">loadtest <span class=\"token parameter variable\">-n<\/span> <span class=\"token number\">1200<\/span> <span class=\"token parameter variable\">-c<\/span> <span class=\"token number\">200<\/span> <span class=\"token parameter variable\">-k<\/span> http:\/\/localhost:3000\/heavy\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>The output will closely match the following:<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"Output\">Output\r\n<p>\u8bf7\u6c42\uff1a0 (0%)\uff0c\u6bcf\u79d2\u8bf7\u6c42\u6570\uff1a0\uff0c\u5e73\u5747\u5ef6\u8fdf\uff1a0 \u6beb\u79d2<\/p>\r\n\r\n<p>\u76ee\u6807URL\uff1a          http:\/\/localhost:3000\/heavy<br>\r\n\u6700\u5927\u8bf7\u6c42\u6570\uff1a        1200<br>\r\n\u5e76\u53d1\u7ea7\u522b\uff1a         200<br>\r\n\u4ee3\u7406\uff1a             keepalive<\/p>\r\n\r\n<p>\u5df2\u5b8c\u6210\u8bf7\u6c42\uff1a       1200<br>\r\n\u603b\u9519\u8bef\u6570\uff1a         0<br>\r\n\u603b\u65f6\u95f4\uff1a           <mark>3.771868785 \u79d2<\/mark><br>\r\n\u6bcf\u79d2\u8bf7\u6c42\u6570\uff1a       <mark>318<\/mark><br>\r\n\u5e73\u5747\u5ef6\u8fdf\uff1a         <mark>574.4 \u6beb\u79d2<\/mark><\/p>\r\n\r\n<p>\u5728\u4e00\u5b9a\u65f6\u95f4\u5185\u5b8c\u6210\u7684\u8bf7\u6c42\u767e\u5206\u6bd4<br>\r\n  50%      216 \u6beb\u79d2<br>\r\n  90%      2859 \u6beb\u79d2<br>\r\n  95%      3016 \u6beb\u79d2<br>\r\n  99%      3028 \u6beb\u79d2<br>\r\n  100%     3084 \u6beb\u79d2\uff08\u6700\u957f\u8bf7\u6c42\uff09<\/p>\r\n\r\n<p>\u603b\u65f6\u95f4\u3001\u6bcf\u79d2\u8bf7\u6c42\u6570\u548c\u5e73\u5747\u5ef6\u8fdf\u4e0e\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\u65f6\u751f\u6210\u7684\u6307\u6807\u63a5\u8fd1\u3002\u8fd9\u79cd\u4e00\u81f4\u6027\u8868\u660epm2\u7684\u6269\u5c55\u5de5\u4f5c\u65b9\u5f0f\u7c7b\u4f3c\u3002<\/p>\r\n\r\n<p>\u4e3a\u4e86\u6539\u5584\u4f7f\u7528pm2\u7684\u5de5\u4f5c\u6d41\u7a0b\uff0c\u60a8\u53ef\u4ee5\u751f\u6210\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u6765\u4f20\u9012\u5e94\u7528\u7a0b\u5e8f\u7684\u914d\u7f6e\u8bbe\u7f6e\u3002\u8fd9\u79cd\u65b9\u6cd5\u5141\u8bb8\u60a8\u65e0\u9700\u4f20\u9012\u9009\u9879\u5373\u53ef\u542f\u52a8\u6216\u91cd\u542f\u96c6\u7fa4\u3002<\/p>\r\n\r\n<p>\u8981\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\uff0c\u8bf7\u5220\u9664\u5f53\u524d\u96c6\u7fa4\uff1a<\/p>\r\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">pm2 delete index.js\r\n<\/li><\/ol><\/code><\/pre>\n<p>\u60a8\u5c06\u6536\u5230\u4e00\u4e2a\u5df2\u5220\u9664\u7684\u54cd\u5e94\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa[PM2] \u6b63\u5728\u5e94\u7528 deleteProcessId \u64cd\u4f5c\u5230\u5e94\u7528 [index.js](ids: [ 0, 1, 2, 3 ])\r\n[PM2] [index](2) \u2713\r\n[PM2] [index](1) \u2713\r\n[PM2] [index](0) \u2713\r\n[PM2] [index](3) \u2713\r\n\u250c\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u2502 id \u2502 \u540d\u79f0               \u2502 \u6a21\u5f0f     \u2502 \u21ba    \u2502 \u72b6\u6001      \u2502 cpu      \u2502 \u5185\u5b58     \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n<\/div><\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u751f\u6210\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">pm2 ecosystem\r\n<\/li><\/ol><\/code><\/pre>\n<p>\u8f93\u51fa\u5c06\u786e\u8ba4\u6587\u4ef6\u5df2\u751f\u6210\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa\u6587\u4ef6 \/home\/<mark>sammy<\/mark>\/cluster_demo\/ecosystem.config.js \u5df2\u751f\u6210\r\n<\/div><\/code><\/pre>\n<p>\u5c06.js\u91cd\u547d\u540d\u4e3a.cjs\u4ee5\u542f\u7528\u5bf9ES\u6a21\u5757\u7684\u652f\u6301\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">mv<\/span> ecosystem.config.js ecosystem.config.cjs\r\n<\/li><\/ol><\/code><\/pre>\n<p>\u4f7f\u7528\u60a8\u7684\u7f16\u8f91\u5668\uff0c\u6253\u5f00\u914d\u7f6e\u6587\u4ef6\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\"><span class=\"token function\">nano<\/span> ecosystem.config.cjs\r\n<\/li><\/ol><\/code><\/pre>\n<p>\u5728\u60a8\u7684ecosystem.config.cjs\u6587\u4ef6\u4e2d\uff0c\u6dfb\u52a0\u4e0b\u9762\u9ad8\u4eae\u663e\u793a\u7684\u4ee3\u7801\uff1a<\/p>\n<div>cluster_demo\/ecosystem.config.cjs<\/p>\n<pre class=\"post-pre\"><code>module.exports = {\r\n  apps : [{\r\n    script: 'index.js',\r\n    watch: '.'<mark>,<\/mark>\r\n    <mark>name: \"cluster_app\",<\/mark>\r\n    <mark>instances: 0,<\/mark>\r\n    <mark>exec_mode: \"cluster\",<\/mark>\r\n  }, {\r\n    script: '.\/service-worker\/',\r\n    watch: ['.\/service-worker']\r\n  }],\r\n\r\n  deploy : {\r\n    production : {\r\n      user : 'SSH_USERNAME',\r\n      host : 'SSH_HOSTMACHINE',\r\n      ref  : 'origin\/master',\r\n      repo : 'GIT_REPOSITORY',\r\n      path : 'DESTINATION_PATH',\r\n      'pre-deploy-local': '',\r\n      'post-deploy' : 'npm install &amp;&amp; pm2 reload ecosystem.config.<mark>cjs<\/mark> --env production',\r\n      'pre-setup': ''\r\n    }\r\n  }\r\n};\r\n<\/code><\/pre>\n<\/div>\n<p>script\u9009\u9879\u63a5\u53d7\u5c06\u5728pm2\u5305\u751f\u6210\u7684\u6bcf\u4e2a\u8fdb\u7a0b\u4e2d\u8fd0\u884c\u7684\u6587\u4ef6\u3002name\u5c5e\u6027\u63a5\u53d7\u4efb\u4f55\u53ef\u4ee5\u6807\u8bc6\u96c6\u7fa4\u7684\u540d\u79f0\uff0c\u8fd9\u5728\u60a8\u9700\u8981\u505c\u6b62\u3001\u91cd\u542f\u6216\u6267\u884c\u5176\u4ed6\u64cd\u4f5c\u65f6\u4f1a\u6709\u5e2e\u52a9\u3002instances\u5c5e\u6027\u63a5\u53d7\u60a8\u60f3\u8981\u7684\u5b9e\u4f8b\u6570\u91cf\u3002\u5c06instances\u8bbe\u7f6e\u4e3a0\u5c06\u4f7fpm2\u751f\u6210\u4e0eCPU\u6570\u91cf\u76f8\u540c\u7684\u8fdb\u7a0b\u3002exec_mode\u63a5\u53d7cluster\u9009\u9879\uff0c\u8fd9\u544a\u8bc9pm2\u4ee5\u96c6\u7fa4\u6a21\u5f0f\u8fd0\u884c\u3002<\/p>\n<p>\u5b8c\u6210\u540e\uff0c\u4fdd\u5b58\u5e76\u5173\u95ed\u60a8\u7684\u6587\u4ef6\u3002<\/p>\n<p>\u8981\u542f\u52a8\u96c6\u7fa4\uff0c\u8bf7\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">pm2 start ecosystem.config.cjs\r\n<\/li><\/ol><\/code><\/pre>\n<p>\u60a8\u5c06\u6536\u5230\u4ee5\u4e0b\u54cd\u5e94\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa[PM2][WARN] \u5e94\u7528\u7a0b\u5e8f cluster_app, service-worker \u672a\u8fd0\u884c\uff0c\u6b63\u5728\u542f\u52a8...\r\n[PM2][ERROR] \u9519\u8bef\uff1a\u672a\u627e\u5230\u811a\u672c\uff1a\/home\/node-user\/cluster_demo\/service-worker\r\n[PM2] \u5e94\u7528\u7a0b\u5e8f [cluster_app] \u5df2\u542f\u52a8\uff084\u4e2a\u5b9e\u4f8b\uff09\r\n<\/div><\/code><\/pre>\n<p>\u6700\u540e\u4e00\u884c\u786e\u8ba4\u67094\u4e2a\u8fdb\u7a0b\u6b63\u5728\u8fd0\u884c\u3002\u7531\u4e8e\u60a8\u5728\u672c\u6559\u7a0b\u4e2d\u5c1a\u672a\u521b\u5efaservice-worker\u811a\u672c\uff0c\u56e0\u6b64\u53ef\u4ee5\u5ffd\u7565\u5173\u4e8e\u672a\u627e\u5230service-worker\u7684\u9519\u8bef\u3002<\/p>\n<p>\u8981\u786e\u8ba4\u96c6\u7fa4\u6b63\u5728\u8fd0\u884c\uff0c\u8bf7\u68c0\u67e5\u72b6\u6001\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">pm2 <span class=\"token function\">ls<\/span>\r\n<\/li><\/ol><\/code><\/pre>\n<p>\u60a8\u5c06\u6536\u5230\u4e00\u4e2a\u786e\u8ba4\u56db\u4e2a\u8fdb\u7a0b\u6b63\u5728\u8fd0\u884c\u7684\u54cd\u5e94\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa\r\n<\/div><\/code><\/pre>\n<pre class=\"post-pre\"><code>\u250c\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u2502 id \u2502 \u540d\u79f0               \u2502 \u6a21\u5f0f     \u2502 \u21ba    \u2502 \u72b6\u6001      \u2502 CPU      \u2502 \u5185\u5b58     \u2502\r\n\u251c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0  \u2502 <mark>cluster_app<\/mark>        \u2502 cluster  \u2502 0    \u2502 online    \u2502 0%       \u2502 56.9mb   \u2502\r\n\u2502 1  \u2502 <mark>cluster_app<\/mark>        \u2502 cluster  \u2502 0    \u2502 online    \u2502 0%       \u2502 57.6mb   \u2502\r\n\u2502 2  \u2502 <mark>cluster_app<\/mark>        \u2502 cluster  \u2502 0    \u2502 online    \u2502 0%       \u2502 55.9mb   \u2502\r\n\u2502 3  \u2502 <mark>cluster_app<\/mark>        \u2502 cluster  \u2502 0    \u2502 online    \u2502 0%       \u2502 55.9mb   \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n<\/code><\/pre>\n<p>\u5982\u679c\u4f60\u60f3\u91cd\u542f\u96c6\u7fa4\uff0c\u53ef\u4ee5\u4f7f\u7528\u4f60\u5728 ecosystem.config.cjs \u6587\u4ef6\u4e2d\u5b9a\u4e49\u7684\u5e94\u7528\u540d\u79f0\uff0c\u5728\u672c\u4f8b\u4e2d\u662f cluster_app\uff1a<\/p>\n<pre class=\"post-pre\"><code><ol><li data-prefix=\"$\">pm2 restart <mark>cluster_app<\/mark>\r\n<\/li><\/ol>\r\n<\/code><\/pre>\n<p>\u96c6\u7fa4\u5c06\u91cd\u542f\uff1a<\/p>\n<pre class=\"post-pre\"><code><div class=\"secondary-code-label\" title=\"\u8f93\u51fa\">\u8f93\u51fa\u4f7f\u7528 --update-env \u6765\u66f4\u65b0\u73af\u5883\u53d8\u91cf\r\n[PM2] \u6b63\u5728\u5e94\u7528 restartProcessId \u64cd\u4f5c\u5230\u5e94\u7528 [cluster_app](ids: [ 0, 1, 2, 3 ])\r\n[PM2] [cluster_app](0) \u2713\r\n[PM2] [cluster_app](1) \u2713\r\n[PM2] [cluster_app](2) \u2713\r\n[PM2] [cluster_app](3) \u2713\r\n\u250c\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\r\n\u2502 id \u2502 \u540d\u79f0               \u2502 \u6a21\u5f0f     \u2502 \u21ba    \u2502 \u72b6\u6001      \u2502 CPU      \u2502 \u5185\u5b58     \u2502\r\n\u251c\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524\r\n\u2502 0  \u2502 cluster_app        \u2502 cluster  \u2502 1    \u2502 online    \u2502 0%       \u2502 48.0mb   \u2502\r\n\u2502 1  \u2502 cluster_app        \u2502 cluster  \u2502 1    \u2502 online    \u2502 0%       \u2502 47.9mb   \u2502\r\n\u2502 2  \u2502 cluster_app        \u2502 cluster  \u2502 1    \u2502 online    \u2502 0%       \u2502 38.8mb   \u2502\r\n\u2502 3  \u2502 cluster_app        \u2502 cluster  \u2502 1    \u2502 online    \u2502 0%       \u2502 31.5mb   \u2502\r\n\u2514\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\r\n<\/code><\/pre>\n<p>\u8981\u7ee7\u7eed\u7ba1\u7406\u4f60\u7684\u96c6\u7fa4\uff0c\u53ef\u4ee5\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<div>\n<div class=\"post-table\">\n<table>\n<thead>\n<tr>\n<th>\u547d\u4ee4<\/th>\n<th>\u63cf\u8ff0<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>pm2 start <mark>app_name<\/mark><\/code><\/td>\n<td>\u542f\u52a8\u96c6\u7fa4<\/td>\n<\/tr>\n<tr>\n<td><code>pm2 restart <mark>app_name<\/mark> <\/code><\/td>\n<td>\u7ec8\u6b62\u96c6\u7fa4\u5e76\u91cd\u65b0\u542f\u52a8<\/td>\n<\/tr>\n<tr>\n<td><code>pm2 reload <mark>app_name<\/mark><\/code><\/td>\n<td>\u65e0\u505c\u673a\u65f6\u95f4\u91cd\u542f\u96c6\u7fa4<\/td>\n<\/tr>\n<tr>\n<td><code>pm2 stop <mark>app_name<\/mark><\/code><\/td>\n<td>\u505c\u6b62\u96c6\u7fa4<\/td>\n<\/tr>\n<tr>\n<td><code>pm2 delete <mark>app_name<\/mark><\/code><\/td>\n<td>\u5220\u9664\u96c6\u7fa4<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u73b0\u5728\u4f60\u53ef\u4ee5\u4f7f\u7528 pm2 \u6a21\u5757\u548c\u96c6\u7fa4\u6a21\u5757\u6765\u6269\u5c55\u4f60\u7684\u5e94\u7528\u7a0b\u5e8f\u3002<\/p>\n<h2>\u7ed3\u8bba<\/h2>\n<p>\u5728\u672c\u6559\u7a0b\u4e2d\uff0c\u4f60\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\u6269\u5c55\u4e86\u4f60\u7684\u5e94\u7528\u7a0b\u5e8f\u3002\u9996\u5148\uff0c\u4f60\u521b\u5efa\u4e86\u4e00\u4e2a\u4e0d\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\u7684\u7a0b\u5e8f\u3002\u7136\u540e\uff0c\u4f60\u521b\u5efa\u4e86\u4e00\u4e2a\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\u5c06\u5e94\u7528\u7a0b\u5e8f\u6269\u5c55\u5230\u673a\u5668\u4e0a\u591a\u4e2aCPU\u7684\u7a0b\u5e8f\u3002\u4e4b\u540e\uff0c\u4f60\u6bd4\u8f83\u4e86\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\u548c\u4e0d\u4f7f\u7528\u96c6\u7fa4\u6a21\u5757\u7684\u5e94\u7528\u7a0b\u5e8f\u4e4b\u95f4\u7684\u6027\u80fd\u3002\u6700\u540e\uff0c\u4f60\u4f7f\u7528 pm2 \u5305\u4f5c\u4e3a\u96c6\u7fa4\u6a21\u5757\u7684\u66ff\u4ee3\u65b9\u6848\uff0c\u5c06\u5e94\u7528\u7a0b\u5e8f\u6269\u5c55\u5230\u591a\u4e2aCPU\u4e0a\u3002<\/p>\n<p>\u4e3a\u4e86\u8fdb\u4e00\u6b65\u5b66\u4e60\uff0c\u4f60\u53ef\u4ee5\u8bbf\u95ee\u96c6\u7fa4\u6a21\u5757\u6587\u6863\u9875\u9762\u4e86\u89e3\u66f4\u591a\u5173\u4e8e\u8be5\u6a21\u5757\u7684\u4fe1\u606f\u3002<\/p>\n<p>\u5982\u679c\u4f60\u60f3\u7ee7\u7eed\u4f7f\u7528 pm2\uff0c\u53ef\u4ee5\u53c2\u8003 PM2 - \u8fdb\u7a0b\u7ba1\u7406\u6587\u6863\u3002\u4f60\u4e5f\u53ef\u4ee5\u5c1d\u8bd5\u6211\u4eec\u5173\u4e8e\u5982\u4f55\u5728 Ubuntu 22.04 \u4e0a\u4e3a\u751f\u4ea7\u73af\u5883\u8bbe\u7f6e Node.js \u5e94\u7528\u7a0b\u5e8f\u7684 pm2 \u6559\u7a0b\u3002<\/p>\n<p>Node.js \u8fd8\u9644\u5e26\u4e86 worker_threads \u6a21\u5757\uff0c\u8be5\u6a21\u5757\u5141\u8bb8\u4f60\u5c06 CPU \u5bc6\u96c6\u578b\u4efb\u52a1\u5206\u914d\u7ed9\u5de5\u4f5c\u7ebf\u7a0b\uff0c\u4ee5\u4fbf\u5b83\u4eec\u80fd\u591f\u5feb\u901f\u5b8c\u6210\u3002\u5c1d\u8bd5\u6211\u4eec\u5173\u4e8e\u5982\u4f55\u5728 Node.js \u4e2d\u4f7f\u7528\u591a\u7ebf\u7a0b\u7684\u6559\u7a0b\u3002\u4f60\u8fd8\u53ef\u4ee5\u4f7f\u7528\u4e13\u7528\u7684 Web Workers \u4f18\u5316\u524d\u7aef\u7684 CPU \u5bc6\u96c6\u578b\u4efb\u52a1\uff0c\u8fd9\u53ef\u4ee5\u901a\u8fc7\u9075\u5faa\u5982\u4f55\u4f7f\u7528 Web Workers \u5904\u7406 CPU \u5bc6\u96c6\u578b\u4efb\u52a1\u6559\u7a0b\u6765\u5b9e\u73b0\u3002\u5982\u679c\u4f60\u60f3\u4e86\u89e3\u5982\u4f55\u907f\u514d CPU \u5bc6\u96c6\u578b\u4efb\u52a1\u5f71\u54cd\u5e94\u7528\u7a0b\u5e8f\u7684\u8bf7\u6c42\/\u54cd\u5e94\u5468\u671f\uff0c\u8bf7\u67e5\u770b\u5982\u4f55\u4f7f\u7528 Node.js \u548c BullMQ \u5904\u7406\u5f02\u6b65\u4efb\u52a1\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u5f15\u8a00 \u5f53\u60a8\u5728\u5177\u6709\u591a\u4e2aCPU\u7684\u7cfb\u7edf\u4e0a\u8fd0\u884cNode.js\u7a0b\u5e8f\u65f6\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u5b83\u4f1a\u521b\u5efa\u4e00\u4e2a\u4ec5\u4f7f\u7528\u5355\u4e2aCPU\u6267\u884c\u8fdb\u7a0b\u3002\u7531 [&hellip;]<\/p>\n","protected":false},"author":11,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[1688,1686,1687,200,1689],"class_list":{"0":"post-587","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"hentry","6":"category-uncategorized","7":"tag-node-js","9":"tag-1687","10":"tag-200","11":"tag-1689"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Node.js\u96c6\u7fa4\u6280\u672f\u5b8c\u5168\u6307\u5357\uff1a\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u6269\u5c55\u6027\u768410\u79cd\u65b9\u6cd5 - Blog - Silicon Cloud<\/title>\n<meta name=\"description\" content=\"\u6df1\u5165\u4e86\u89e3Node.js\u96c6\u7fa4\u6280\u672f\uff0c\u5b66\u4e60\u5982\u4f55\u901a\u8fc7\u591a\u8fdb\u7a0b\u6a21\u578b\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u53ef\u9760\u6027\u3002\u672c\u6307\u5357\u6db5\u76d6\u96c6\u7fa4\u6a21\u5757\u4f7f\u7528\u3001\u8d1f\u8f7d\u5747\u8861\u7b56\u7565\u53ca\u5b9e\u9645\u5e94\u7528\u6848\u4f8b\uff0c\u52a9\u4f60\u6784\u5efa\u9ad8\u5e76\u53d1Node.js\u5e94\u7528\u3002\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528\u96c6\u7fa4\u6280\u672f\u6269\u5c55node-js\u5e94\u7528\u7a0b\u5e8f\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js\u96c6\u7fa4\u6280\u672f\u5b8c\u5168\u6307\u5357\uff1a\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u6269\u5c55\u6027\u768410\u79cd\u65b9\u6cd5\" \/>\n<meta property=\"og:description\" content=\"\u6df1\u5165\u4e86\u89e3Node.js\u96c6\u7fa4\u6280\u672f\uff0c\u5b66\u4e60\u5982\u4f55\u901a\u8fc7\u591a\u8fdb\u7a0b\u6a21\u578b\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u53ef\u9760\u6027\u3002\u672c\u6307\u5357\u6db5\u76d6\u96c6\u7fa4\u6a21\u5757\u4f7f\u7528\u3001\u8d1f\u8f7d\u5747\u8861\u7b56\u7565\u53ca\u5b9e\u9645\u5e94\u7528\u6848\u4f8b\uff0c\u52a9\u4f60\u6784\u5efa\u9ad8\u5e76\u53d1Node.js\u5e94\u7528\u3002\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528\u96c6\u7fa4\u6280\u672f\u6269\u5c55node-js\u5e94\u7528\u7a0b\u5e8f\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-07T20:28:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-08-02T13:03:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/6564488431a79a2e24944726\/68-0.png\" \/>\n<meta name=\"author\" content=\"\u65b0, \u97f5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u65b0, \u97f5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"19 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/\",\"name\":\"Node.js\u96c6\u7fa4\u6280\u672f\u5b8c\u5168\u6307\u5357\uff1a\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u6269\u5c55\u6027\u768410\u79cd\u65b9\u6cd5 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2022-12-07T20:28:01+00:00\",\"dateModified\":\"2025-08-02T13:03:28+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\"},\"description\":\"\u6df1\u5165\u4e86\u89e3Node.js\u96c6\u7fa4\u6280\u672f\uff0c\u5b66\u4e60\u5982\u4f55\u901a\u8fc7\u591a\u8fdb\u7a0b\u6a21\u578b\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u53ef\u9760\u6027\u3002\u672c\u6307\u5357\u6db5\u76d6\u96c6\u7fa4\u6a21\u5757\u4f7f\u7528\u3001\u8d1f\u8f7d\u5747\u8861\u7b56\u7565\u53ca\u5b9e\u9645\u5e94\u7528\u6848\u4f8b\uff0c\u52a9\u4f60\u6784\u5efa\u9ad8\u5e76\u53d1Node.js\u5e94\u7528\u3002\",\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js\u96c6\u7fa4\u6280\u672f\u5b8c\u5168\u6307\u5357\uff1a\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u6269\u5c55\u6027\u768410\u79cd\u65b9\u6cd5\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9\",\"name\":\"\u65b0, \u97f5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g\",\"caption\":\"\u65b0, \u97f5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Node.js\u96c6\u7fa4\u6280\u672f\u5b8c\u5168\u6307\u5357\uff1a\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u6269\u5c55\u6027\u768410\u79cd\u65b9\u6cd5 - Blog - Silicon Cloud","description":"\u6df1\u5165\u4e86\u89e3Node.js\u96c6\u7fa4\u6280\u672f\uff0c\u5b66\u4e60\u5982\u4f55\u901a\u8fc7\u591a\u8fdb\u7a0b\u6a21\u578b\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u53ef\u9760\u6027\u3002\u672c\u6307\u5357\u6db5\u76d6\u96c6\u7fa4\u6a21\u5757\u4f7f\u7528\u3001\u8d1f\u8f7d\u5747\u8861\u7b56\u7565\u53ca\u5b9e\u9645\u5e94\u7528\u6848\u4f8b\uff0c\u52a9\u4f60\u6784\u5efa\u9ad8\u5e76\u53d1Node.js\u5e94\u7528\u3002","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528\u96c6\u7fa4\u6280\u672f\u6269\u5c55node-js\u5e94\u7528\u7a0b\u5e8f\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"Node.js\u96c6\u7fa4\u6280\u672f\u5b8c\u5168\u6307\u5357\uff1a\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u6269\u5c55\u6027\u768410\u79cd\u65b9\u6cd5","og_description":"\u6df1\u5165\u4e86\u89e3Node.js\u96c6\u7fa4\u6280\u672f\uff0c\u5b66\u4e60\u5982\u4f55\u901a\u8fc7\u591a\u8fdb\u7a0b\u6a21\u578b\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u53ef\u9760\u6027\u3002\u672c\u6307\u5357\u6db5\u76d6\u96c6\u7fa4\u6a21\u5757\u4f7f\u7528\u3001\u8d1f\u8f7d\u5747\u8861\u7b56\u7565\u53ca\u5b9e\u9645\u5e94\u7528\u6848\u4f8b\uff0c\u52a9\u4f60\u6784\u5efa\u9ad8\u5e76\u53d1Node.js\u5e94\u7528\u3002","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5982\u4f55\u4f7f\u7528\u96c6\u7fa4\u6280\u672f\u6269\u5c55node-js\u5e94\u7528\u7a0b\u5e8f\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2022-12-07T20:28:01+00:00","article_modified_time":"2025-08-02T13:03:28+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/6564488431a79a2e24944726\/68-0.png"}],"author":"\u65b0, \u97f5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u65b0, \u97f5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"19 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/","name":"Node.js\u96c6\u7fa4\u6280\u672f\u5b8c\u5168\u6307\u5357\uff1a\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u6269\u5c55\u6027\u768410\u79cd\u65b9\u6cd5 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2022-12-07T20:28:01+00:00","dateModified":"2025-08-02T13:03:28+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9"},"description":"\u6df1\u5165\u4e86\u89e3Node.js\u96c6\u7fa4\u6280\u672f\uff0c\u5b66\u4e60\u5982\u4f55\u901a\u8fc7\u591a\u8fdb\u7a0b\u6a21\u578b\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u53ef\u9760\u6027\u3002\u672c\u6307\u5357\u6db5\u76d6\u96c6\u7fa4\u6a21\u5757\u4f7f\u7528\u3001\u8d1f\u8f7d\u5747\u8861\u7b56\u7565\u53ca\u5b9e\u9645\u5e94\u7528\u6848\u4f8b\uff0c\u52a9\u4f60\u6784\u5efa\u9ad8\u5e76\u53d1Node.js\u5e94\u7528\u3002","breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js\u96c6\u7fa4\u6280\u672f\u5b8c\u5168\u6307\u5357\uff1a\u63d0\u5347\u5e94\u7528\u6027\u80fd\u4e0e\u6269\u5c55\u6027\u768410\u79cd\u65b9\u6cd5"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/4ba4019495123db3038fd0809e6959c9","name":"\u65b0, \u97f5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d484b6c6e4ae82e8a9efea989e1d2af46d9b6ef128101e63b18f559fca0ae627?s=96&d=mm&r=g","caption":"\u65b0, \u97f5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yunxin\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8%e9%9b%86%e7%be%a4%e6%8a%80%e6%9c%af%e6%89%a9%e5%b1%95node-js%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/587","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=587"}],"version-history":[{"count":3,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/587\/revisions"}],"predecessor-version":[{"id":110314,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/587\/revisions\/110314"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=587"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=587"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=587"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}