用十條命令在一分鐘內檢查Linux服務器性能

這種干活必須要和大家分享的啊。

如果你的Linux服務器突然負載暴增,告警短信快發爆你的手機,如何在最短時間內找出Linux性能問題所在?來看Netflix性能工程團隊的這篇博文,看它們通過十條命令在一分鐘內對機器性能問題進行診斷。

概述

通過執行以下命令,可以在1分鐘內對系統資源使用情況有個大致的了解。

  • uptime

  • dmesg | tail

  • vmstat 1

  • mpstat -P ALL 1

  • pidstat 1

  • iostat -xz 1

  • free -m

  • sar -n DEV 1

  • sar -n TCP,ETCP 1

  • top

其中一些命令需要安裝sysstat包,有一些由procps包提供。這些命令的輸出,有助于快速定位性能瓶頸,檢查出所有資源(CPU、內存、磁盤IO等)的利用率(utilization)、飽和度(saturation)和錯誤(error)度量,也就是所謂的USE方法。

下面我們來逐一介紹下這些命令,有關這些命令更多的參數和說明,請參照命令的手冊。

uptime

$?uptime
23:51:26?up?21:31,??1?user,??load?average:?30.02,?26.43,?19.02

?

這個命令可以快速查看機器的負載情況。在Linux系統中,這些數據表示等待CPU資源的進程和阻塞在不可中斷IO進程(進程狀態為D)的數量。這些數據可以讓我們對系統資源使用有一個宏觀的了解。

命令的輸出分別表示1分鐘、5分鐘、15分鐘的平均負載情況。通過這三個數據,可以了解服務器負載是在趨于緊張還是區域緩解。如果1分鐘平均負載很高,而15分鐘平均負載很低,說明服務器正在命令高負載情況,需要進一步排查CPU資源都消耗在了哪里。反之,如果15分鐘平均負載很高,1分鐘平均負載較低,則有可能是CPU資源緊張時刻已經過去。

上面例子中的輸出,可以看見最近1分鐘的平均負載非常高,且遠高于最近15分鐘負載,因此我們需要繼續排查當前系統中有什么進程消耗了大量的資源。可以通過下文將會介紹的vmstat、mpstat等命令進一步排查。

dmesg | tail

$?dmesg?|?tail
[1880957.563150]?perl?invoked?oom-killer:?gfp_mask=0x280da,?order=0,?oom_score_adj=0 [...] [1880957.563400]?Out?of?memory:?Kill?process?18694?(perl)?score?246?or?sacrifice?child [1880957.563408]?Killed?process?18694?(perl)?total-vm:1972392kB,?anon-rss:1953348kB,?file-rss:0kB [2320864.954447]?TCP:?Possible?SYN?flooding?on?port?7001.?Dropping?request.??Check?SNMP?counters.

?

該命令會輸出系統日志的最后10行。示例中的輸出,可以看見一次內核的oom kill和一次TCP丟包。這些日志可以幫助排查性能問題。千萬不要忘了這一步。

vmstat 1

$?vmstat?1
procs?---------memory----------?---swap--?-----io----?-system--?------cpu-----r??b?swpd???free???buff??cache???si???so????bi????bo???in???cs?us?sy?id?wa?st 34??0????0?200889792??73708?591828????0????0?????0?????5????6???10?96??1??3??0??0 32??0????0?200889920??73708?591860????0????0?????0???592?13284?4282?98??1??1??0??0 32??0????0?200890112??73708?591860????0????0?????0?????0?9501?2154?99??1??0??0??0 32??0????0?200889568??73712?591856????0????0?????0????48?11900?2459?99??0??0??0??0 32??0????0?200890208??73712?591860????0????0?????0?????0?15898?4840?98??1??1??0??0 ^C

vmstat(8) 命令,每行會輸出一些系統核心指標,這些指標可以讓我們更詳細的了解系統狀態。后面跟的參數1,表示每秒輸出一次統計信息,表頭提示了每一列的含義,這幾介紹一些和性能調優相關的列:

  • r:等待在CPU資源的進程數。這個數據比平均負載更加能夠體現CPU負載情況,數據中不包含等待IO的進程。如果這個數值大于機器CPU核數,那么機器的CPU資源已經飽和。

  • free:系統可用內存數(以千字節為單位),如果剩余內存不足,也會導致系統性能問題。下文介紹到的free命令,可以更詳細的了解系統內存的使用情況。

  • si, so:交換區寫入和讀取的數量。如果這個數據不為0,說明系統已經在使用交換區(swap),機器物理內存已經不足。

  • us, sy, id, wa, st:這些都代表了CPU時間的消耗,它們分別表示用戶時間(user)、系統(內核)時間(sys)、空閑時間(idle)、IO等待時間(wait)和被偷走的時間(stolen,一般被其他虛擬機消耗)。

上述這些CPU時間,可以讓我們很快了解CPU是否出于繁忙狀態。一般情況下,如果用戶時間和系統時間相加非常大,CPU出于忙于執行指令。如果IO等待時間很長,那么系統的瓶頸可能在磁盤IO。

示例命令的輸出可以看見,大量CPU時間消耗在用戶態,也就是用戶應用程序消耗了CPU時間。這不一定是性能問題,需要結合r隊列,一起分析。

mpstat -P ALL 1

$?mpstat?-P?ALL?1
Linux?3.13.0-49-generic?(titanclusters-xxxxx)??07/14/2015??_x86_64_?(32?CPU) 07:38:49?PM??CPU???%usr??%nice???%sys?%iowait???%irq??%soft??%steal??%guest??%gnice??%idle 07:38:50?PM??all??98.47???0.00???0.75????0.00???0.00???0.00????0.00????0.00????0.00???0.78 07:38:50?PM????0??96.04???0.00???2.97????0.00???0.00???0.00????0.00????0.00????0.00???0.99 07:38:50?PM????1??97.00???0.00???1.00????0.00???0.00???0.00????0.00????0.00????0.00???2.00 07:38:50?PM????2??98.00???0.00???1.00????0.00???0.00???0.00????0.00????0.00????0.00???1.00 07:38:50?PM????3??96.97???0.00???0.00????0.00???0.00???0.00????0.00????0.00????0.00???3.03 [...]

該命令可以顯示每個CPU的占用情況,如果有一個CPU占用率特別高,那么有可能是一個單線程應用程序引起的。

pidstat 1

$?pidstat?1
Linux?3.13.0-49-generic?(titanclusters-xxxxx)??07/14/2015????_x86_64_????(32?CPU) 07:41:02?PM???UID???????PID????%usr?%system??%guest????%CPU???CPU??Command 07:41:03?PM?????0?????????9????0.00????0.94????0.00????0.94?????1??rcuos/0 07:41:03?PM?????0??????4214????5.66????5.66????0.00???11.32????15??mesos-slave 07:41:03?PM?????0??????4354????0.94????0.94????0.00????1.89?????8??java 07:41:03?PM?????0??????6521?1596.23????1.89????0.00?1598.11????27??java 07:41:03?PM?????0??????6564?1571.70????7.55????0.00?1579.25????28??java 07:41:03?PM?60004?????60154????0.94????4.72????0.00????5.66?????9??pidstat 07:41:03?PM???UID???????PID????%usr?%system??%guest????%CPU???CPU??Command 07:41:04?PM?????0??????4214????6.00????2.00????0.00????8.00????15??mesos-slave 07:41:04?PM?????0??????6521?1590.00????1.00????0.00?1591.00????27??java 07:41:04?PM?????0??????6564?1573.00???10.00????0.00?1583.00????28??java 07:41:04?PM???108??????6718????1.00????0.00????0.00????1.00?????0??snmp-pass 07:41:04?PM?60004?????60154????1.00????4.00????0.00????5.00?????9??pidstat ^C

pidstat命令輸出進程的CPU占用率,該命令會持續輸出,并且不會覆蓋之前的數據,可以方便觀察系統動態。如上的輸出,可以看見兩個JAVA進程占用了將近1600%的CPU時間,既消耗了大約16個CPU核心的運算資源。

iostat -xz 1

$?iostat?-xz?1
Linux?3.13.0-49-generic?(titanclusters-xxxxx)??07/14/2015??_x86_64_?(32?CPU) avg-cpu:??%user???%nice?%system?%iowait??%steal???%idle ??????????73.96????0.00????3.73????0.03????0.06???22.21 Device:???rrqm/s???wrqm/s?????r/s?????w/s????rkB/s????wkB/s?avgrq-sz?avgqu-sz???await?r_await?w_await??svctm??%util xvda????????0.00?????0.23????0.21????0.18?????4.52?????2.08????34.37?????0.00????9.98???13.80????5.42???2.44???0.09 xvdb????????0.01?????0.00????1.02????8.94???127.97???598.53???145.79?????0.00????0.43????1.78????0.28???0.25???0.25 xvdc????????0.01?????0.00????1.02????8.86???127.79???595.94???146.50?????0.00????0.45????1.82????0.30???0.27???0.26 dm-0????????0.00?????0.00????0.69????2.32????10.47????31.69????28.01?????0.01????3.23????0.71????3.98???0.13???0.04 dm-1????????0.00?????0.00????0.00????0.94?????0.01?????3.78?????8.00?????0.33??345.84????0.04??346.81???0.01???0.00 dm-2????????0.00?????0.00????0.09????0.07?????1.35?????0.36????22.50?????0.00????2.55????0.23????5.62???1.78???0.03 [...] ^C

iostat命令主要用于查看機器磁盤IO情況。該命令輸出的列,主要含義是:

  • r/s, w/s, rkB/s, wkB/s:分別表示每秒讀寫次數和每秒讀寫數據量(千字節)。讀寫量過大,可能會引起性能問題。

  • await:IO操作的平均等待時間,單位是毫秒。這是應用程序在和磁盤交互時,需要消耗的時間,包括IO等待和實際操作的耗時。如果這個數值過大,可能是硬件設備遇到了瓶頸或者出現故障。

  • avgqu-sz:向設備發出的請求平均數量。如果這個數值大于1,可能是硬件設備已經飽和(部分前端硬件設備支持并行寫入)。

  • %util:設備利用率。這個數值表示設備的繁忙程度,經驗值是如果超過60,可能會影響IO性能(可以參照IO操作平均等待時間)。如果到達100%,說明硬件設備已經飽和。

如果顯示的是邏輯設備的數據,那么設備利用率不代表后端實際的硬件設備已經飽和。值得注意的是,即使IO性能不理想,也不一定意味這應用程序性能會不好,可以利用諸如預讀取、寫緩存等策略提升應用性能。

free –m

$?free?-mtotal???????used???????free?????shared????buffers?????cached
Mem:????????245998??????24545?????221453?????????83?????????59????????541 -/+?buffers/cache:??????23944?????222053 Swap:????????????0??????????0??????????0

free命令可以查看系統內存的使用情況,-m參數表示按照兆字節展示。最后兩列分別表示用于IO緩存的內存數,和用于文件系統頁緩存的內存數。需要注意的是,第二行-/+ buffers/cache,看上去緩存占用了大量內存空間。這是Linux系統的內存使用策略,盡可能的利用內存,如果應用程序需要內存,這部分內存會立即被回收并分配給應用程序。因此,這部分內存一般也被當成是可用內存。

如果可用內存非常少,系統可能會動用交換區(如果配置了的話),這樣會增加IO開銷(可以在iostat命令中提現),降低系統性能。

sar -n DEV 1

$?sar?-n?DEV?1
Linux?3.13.0-49-generic?(titanclusters-xxxxx)??07/14/2015?????_x86_64_????(32?CPU) 12:16:48?AM?????IFACE???rxpck/s???txpck/s????rxkB/s????txkB/s???rxcmp/s???txcmp/s??rxmcst/s???%ifutil 12:16:49?AM??????eth0??18763.00???5032.00??20686.42????478.30??????0.00??????0.00??????0.00??????0.00 12:16:49?AM????????lo?????14.00?????14.00??????1.36??????1.36??????0.00??????0.00??????0.00??????0.00 12:16:49?AM???docker0??????0.00??????0.00??????0.00??????0.00??????0.00??????0.00??????0.00??????0.00 12:16:49?AM?????IFACE???rxpck/s???txpck/s????rxkB/s????txkB/s???rxcmp/s???txcmp/s??rxmcst/s???%ifutil 12:16:50?AM??????eth0??19763.00???5101.00??21999.10????482.56??????0.00??????0.00??????0.00??????0.00 12:16:50?AM????????lo?????20.00?????20.00??????3.25??????3.25??????0.00??????0.00??????0.00??????0.00 12:16:50?AM???docker0??????0.00??????0.00??????0.00??????0.00??????0.00??????0.00??????0.00??????0.00 ^C

sar命令在這里可以查看網絡設備的吞吐率。在排查性能問題時,可以通過網絡設備的吞吐量,判斷網絡設備是否已經飽和。如示例輸出中,eth0網卡設備,吞吐率大概在22 Mbytes/s,既176 Mbits/sec,沒有達到1Gbit/sec的硬件上限。

sar -n TCP,ETCP 1

$?sar?-n?TCP,ETCP?1
Linux?3.13.0-49-generic?(titanclusters-xxxxx)??07/14/2015????_x86_64_????(32?CPU) 12:17:19?AM??active/s?passive/s????iseg/s????oseg/s 12:17:20?AM??????1.00??????0.00??10233.00??18846.00 12:17:19?AM??atmptf/s??estres/s?retrans/s?isegerr/s???orsts/s 12:17:20?AM??????0.00??????0.00??????0.00??????0.00??????0.00 12:17:20?AM??active/s?passive/s????iseg/s????oseg/s 12:17:21?AM??????1.00??????0.00???8359.00???6039.00 12:17:20?AM??atmptf/s??estres/s?retrans/s?isegerr/s???orsts/s 12:17:21?AM??????0.00??????0.00??????0.00??????0.00??????0.00 ^C

sar命令在這里用于查看TCP連接狀態,其中包括:

  • active/s:每秒本地發起的TCP連接數,既通過connect調用創建的TCP連接;

  • passive/s:每秒遠程發起的TCP連接數,即通過accept調用創建的TCP連接;

  • retrans/s:每秒TCP重傳數量;

TCP連接數可以用來判斷性能問題是否由于建立了過多的連接,進一步可以判斷是主動發起的連接,還是被動接受的連接。TCP重傳可能是因為網絡環境惡劣,或者服務器壓力過大導致丟包。

top

$?top
top?-?00:15:40?up?21:56,??1?user,??load?average:?31.09,?29.87,?29.92 Tasks:?871?total,???1?running,?868?sleeping,???0?stopped,???2?zombie %Cpu(s):?96.8?us,??0.4?sy,??0.0?ni,??2.7?id,??0.1?wa,??0.0?hi,??0.0?si,??0.0?st KiB?Mem:??25190241+total,?24921688?used,?22698073+free,????60448?buffers KiB?Swap:????????0?total,????????0?used,????????0?free.???554208?cached?Mem ???PID?USER??????PR??NI????VIRT????RES????SHR?S??%CPU?%MEM?????TIME+?COMMAND ?20248?root??????20???0??0.227t?0.012t??18748?S??3090??5.2??29812:58?java ??4213?root??????20???0?2722544??64640??44232?S??23.5??0.0?233:35.37?mesos-slave ?66128?titancl+??20???0???24344???2332???1172?R???1.0??0.0???0:00.07?top ??5235?root??????20???0?38.227g?547004??49996?S???0.7??0.2???2:02.74?java ??4299?root??????20???0?20.015g?2.682g??16836?S???0.3??1.1??33:14.42?java ?????1?root??????20???0???33620???2920???1496?S???0.0??0.0???0:03.82?init ?????2?root??????20???0???????0??????0??????0?S???0.0??0.0???0:00.02?kthreadd ?????3?root??????20???0???????0??????0??????0?S???0.0??0.0???0:05.35?ksoftirqd/0 ?????5?root???????0?-20???????0??????0??????0?S???0.0??0.0???0:00.00?kworker/0:0H ?????6?root??????20???0???????0??????0??????0?S???0.0??0.0???0:06.94?kworker/u256:0 ?????8?root??????20???0???????0??????0??????0?S???0.0??0.0???2:38.05?rcu_sched t

top命令包含了前面好幾個命令的檢查的內容。比如系統負載情況(uptime)、系統內存使用情況(free)、系統CPU使用情況(vmstat)等。因此通過這個命令,可以相對全面的查看系統負載的來源。同時,top命令支持排序,可以按照不同的列排序,方便查找出諸如內存占用最多的進程、CPU占用率最高的進程等。

但是,top命令相對于前面一些命令,輸出是一個瞬間值,如果不持續盯著,可能會錯過一些線索。這時可能需要暫停top命令刷新,來記錄和比對數據。

總結

排查Linux服務器性能問題還有很多工具,上面介紹的一些命令,可以幫助我們快速的定位問題。例如前面的示例輸出,多個證據證明有JAVA進程占用了大量CPU資源,之后的性能調優就可以針對應用程序進行。

原文地址:http://www.infoq.com/cn/news/2015/12/linux-performance

轉載于:https://www.cnblogs.com/technologykai/articles/8400194.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/284264.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/284264.shtml
英文地址,請注明出處:http://en.pswp.cn/news/284264.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[javaEE] JDBC快速入門

JDBC:Java Data Base Connectivity java數據庫連接 1.組成JDBC的兩個包:主要是接口 java.sql javax.sql 2.相應JDBC的數據庫實現 在tomcat的目錄下面添加mysql-connector-java-5.0.8-bin.jar這個數據庫驅動包 package com.tsh.web;import java.io.IOExce…

【ArcGIS微課1000例】0053:注記(水平、沿直線、跟隨要素、牽引線、彎曲注記)的創建與編輯

文章目錄 一、創建注記1.創建注記要素類2. 水平注記3. 沿直線4. 隨沿要素5. 沿引線6. 彎曲二、修改注記1. 復制粘貼2. 移動注記3. 旋轉注記4. 刪除注記5. 堆疊和取消堆疊6. 向注記添加引線7. 將注記轉換為多部分8. 編輯關聯要素的注記一、創建注記 注記的創建方法參考:【ArcG…

定制.NET 6.0的依賴注入

本章是《定制ASP NET 6.0框架系列文章》的第三篇。在本章,我們將學習ASP.NET Core的依賴項注入(DI)以及如何自定義它。我們將討論以下主題:使用不同的DI容器探索ConfigureServices方法使用其他的ServiceProviderScrutor簡介技術準…

50 個 Redis 必備知識:基礎知識,架構、調優和監控知識及難點解決

本文包括:30 個 Redis 基礎知識;10個 Redis 架構和運維必懂的知識;Redis 調優、監控知識和10個具體應用難點。 本篇文檔已整理成pdf文檔,需要的同學文末自取 30 個 Redis 基礎知識 1、Redis支持哪幾種數據類型? Str…

【ArcGIS微課1000例】0043:ArcGIS繪制國界線的3種方法

本文講解ArcGIS繪制國界線的3種方法。 文章目錄 1. 直接修改國界線符號2. 緩沖區工具3. 制圖表達1. 直接修改國界線符號 直接修改國界線/省界線的符號。點擊“線要素”出現符號選擇器,點擊【編輯符號】按鈕,編輯成下面右圖的形式。缺點:只能在邊界一側出現緩沖樣式,如下面…

javascript雜記

菜鳥教程   http://www.runoob.com/js/js-tutorial.html 響應鍵盤事件  https://www.cnblogs.com/shihaiming/p/6210655.html 窗口變化  http://www.jb51.net/article/124581.htm div定位1  http://www.divcss5.com/shili/s587.shtml   div定位2  https://www.cnbl…

沒有暑假的Ada 要好好努力咯 C#繼續

嗷嗷嗷啊啊啊啊啊轉載于:https://www.cnblogs.com/AdaLoong/p/5645720.html

C# 獲取系統已安裝的.NET版本

本文經原作者授權以原創方式二次分享,歡迎轉載、分享。原文作者:唐宋元明清原文地址: https://www.cnblogs.com/kybs0/p/16478587.htmlC# 獲取系統已安裝的.NET版本獲取系統已安裝的.NET版本,來確定當前應用可運行的環境。獲取系…

.NET 6 Minimal API 的經驗分享

Minimal API 是 .NET 6 提供的最新功能 , 對比傳統的 ASP.NET Core Web API 方式更加直接 , 你可以用幾行代碼編寫好 REST API 。 沒有了祖傳的 Startup.cs 和 Controller ,通過簡單的代碼就可以完成 API 的開發。在第二階段的 .NET 挑戰賽中就以 .NET 6…

JavaWeb之Filter過濾器

原本計劃這一篇來總結JSP,由于JSP的內容比較多,又想著晚上跑跑步減減肥,所以今天先介紹Filter以及它的使用舉例,這樣的話還有些時間可以鍛煉鍛煉。言歸正傳,過濾器從字面理解她的話有攔網、過濾的功能,可以…

【ArcGIS微課1000例】0054:尺寸注記的創建與編輯

尺寸注記要素是一種特殊類型的文本,用于顯示地圖上的長度或距離,可以創建各種形狀的尺寸注記要素,如對齊、簡單對齊、水平線狀、垂直線狀和旋轉線狀等。 文章目錄 一、創建尺寸注記1. 直接創建尺寸注記要素2. 通過已有尺寸注記要素創建二、編輯尺寸注記1. 刪除尺寸注記要素2…

利用python實現批量查詢ip地址歸屬地址

今天需要查詢nginx訪問的客戶端ip是否和調度一樣!先是用shell把文件中的ip截取出來: python腳本如下:(哈哈,新手寫的很草率)#!/usr/bin/env#-- coding: utf-8 - import jsonimport urllibimport socketimpo…

Cobbler部署之FAQ處理

Cobbler報錯處理 通過cobbler check檢查出現的報錯 紅色標注為報錯關鍵信息 9.1 報錯一 # cobbler check httpd does not appear to be running and proxying cobbler, or SELinux is in the way. Original traceback: Traceback (most recent call last): File "/usr…

基于.NetCore開發博客項目 StarBlog - (16) 一些新功能 (監控/統計/配置/初始化)

系列文章基于.NetCore開發博客項目 StarBlog - (1) 為什么需要自己寫一個博客?基于.NetCore開發博客項目 StarBlog - (2) 環境準備和創建項目基于.NetCore開發博客項目 StarBlog - (3) 模型設計基于.NetCore開發博客項目 StarBlog - (4) markdown博客批量導入基于.N…

堪比JMeter的.Net壓測工具 - Crank 入門篇

1. 前言 Crank 是.NET 團隊用來運行基準測試的基準測試基礎架構,包括(但不限于)來自TechEmpower Web 框架基準測試的場景,是2021年.NET Conf 大會上介紹的一項新的項目,其前身是Benchmarks。 Crank目標之一是為開發人員提供一種工…

【GlobalMapper精品教程】016:按照指定字段批量生成不同用地類型的矢量圖層

Globalmapper中可以很方便的根據指定的字段,對矢量數據進行批量提取,生成不同類型的多個矢量數據,本文以土地利用現狀數據為例,基于DLMC,提取出不同用地類型的矢量圖層。 參考閱讀:【ArcGIS遇上Python】ArcGIS Python按照指定字段批量篩選不同類型的圖斑(以土地利用數據…

javascript閉包—圍觀大神如何解釋閉包

閉包的概念已經出來很長時間了,網上資源一大把,本著拿來主意的方法來看看。 這一篇文章 學習Javascript閉包(Closure) 是大神阮一峰的博文,作者循序漸進,講的很透徹。下面一一剖析。 1.變量的作用域 變量的…

298. Binary Tree Longest Consecutive Sequence

題目:Given a binary tree, find the length of the longest consecutive sequence path. The path refers to any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The longest consecutive path need to…

Educational Codeforces Round 37 (Rated for Div. 2)

Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 題意&#xff1a;Max想給花園澆水。花園可被視為長度為n的花園床&#xff0c;花園內共有k個水龍頭&#xff0c;分別在花園的xi&#xff08;0≤xi<n&#xff09;處&#xff0c;在j秒內花園的[xi-(j-1…

詳解 .Net6 Minimal API 的使用方式

隨著 .Net6 的發布&#xff0c;微軟也改進了對之前 ASP.NET Core 構建方式&#xff0c;使用了新的 Minimal API 模式。以前默認的方式是需要在 Startup 中注冊 IOC 和中間件相關&#xff0c;但是在 Minimal API 模式下你只需要簡單的寫幾行代碼就可以構建一個 ASP.NET Core的We…