Linux 性能診斷:快速檢查單(Netflix版)

快速檢查單

快速檢查單(Quick Reference Handbook,QRH)是飛行員在飛行過(guò)程中依賴(lài)的重要指導(dǎo)性文件。

第一張飛行檢查單起源于一次嚴(yán)重的航空事故。1935年波音公司研制的一架新型轟炸機(jī)在試飛過(guò)程中突然墜機(jī),導(dǎo)致2名機(jī)組人員遇難——包括一名最優(yōu)秀的試飛員普洛耶爾·希爾少校。后來(lái)的調(diào)查結(jié)果分析,事故并不是機(jī)械故障引起的,而是人為失誤造成。新型飛機(jī)比以往的飛機(jī)更復(fù)雜,飛行員要管理4臺(tái)發(fā)動(dòng)機(jī),操控起落架、襟翼、電動(dòng)配平調(diào)整片和恒速液壓變距螺旋槳等。因?yàn)槊τ诟鞣N操作,希爾少校忘記了一項(xiàng)簡(jiǎn)單卻很重要的工作 —— 在起飛前忘記對(duì)新設(shè)計(jì)的升降舵和方向舵實(shí)施解鎖。

美國(guó)軍方組織飛行專(zhuān)家編制了一份飛行檢查單,將起飛、巡航、著陸和滑行各階段的重要步驟寫(xiě)在一張索引卡片上。飛行員根據(jù)檢查單的提示檢查剎車(chē)是否松開(kāi),飛行儀表是否準(zhǔn)確設(shè)定,機(jī)艙門(mén)窗是否完全關(guān)閉,升降舵等控制面是否已經(jīng)解鎖。

Netflix 性能工程團(tuán)隊(duì)

登陸一臺(tái) Linux 服務(wù)器排查性能問(wèn)題:開(kāi)始一分鐘你該檢查哪些呢?
在 Netflix 我們有一個(gè)龐大的 EC2 Linux集群,也有許多性能分析工具用于監(jiān)視和檢查它們的性能。它們包括用于云監(jiān)測(cè)的Atlas (工具代號(hào)) ,用于實(shí)例分析的 Vector (工具代號(hào)) 。盡管這些工具能幫助我們解決大部分問(wèn)題,我們有時(shí)也需要登陸一臺(tái)實(shí)例、運(yùn)行一些標(biāo)準(zhǔn)的 Linux 性能分析工具。在這篇文章,Netflix 性能工程團(tuán)隊(duì)將向您展示:在開(kāi)始的60秒鐘,利用標(biāo)準(zhǔn)的Linux命令行工具,執(zhí)行一次充分的性能檢查。

Linux 性能分析黃金60秒

運(yùn)行以下10個(gè)命令,你可以在60秒內(nèi),獲得系統(tǒng)資源利用率和進(jìn)程運(yùn)行情況的整體概念。查看是否存在異常、評(píng)估飽和度,它們都非常易于理解,可用性強(qiáng)。飽和度表示資源還有多少負(fù)荷可以讓它處理,并且能夠展示請(qǐng)求隊(duì)列的長(zhǎng)度或等待的時(shí)間。

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包。這些命令輸出的指標(biāo),將幫助你掌握一些有效的方法:一整套尋找性能瓶頸的方法論。這些命令需要檢查所有資源的利用率、飽和度和錯(cuò)誤信息(CPU、內(nèi)存、磁盤(pán)等)。同時(shí),當(dāng)你檢查或排除一些資源的時(shí)候,需要注意在檢查過(guò)程中,根據(jù)指標(biāo)數(shù)據(jù)指引,逐步縮小目標(biāo)范圍。

接下來(lái)的章節(jié),將結(jié)合生產(chǎn)環(huán)境的案例演示這些命令。如果希望了解這些工具的詳細(xì)信息,可以查閱它們的操作文檔。

1. uptime

$ uptime
23:51:26up21:31, 1user, loadaverage:30.02,26.43,19.02

這是一個(gè)快速查看平均負(fù)載的方法,表示等待運(yùn)行的任務(wù)(進(jìn)程)數(shù)量。在Linux系統(tǒng)中,這些數(shù)字包含等待CPU運(yùn)行的進(jìn)程數(shù),也包括不間斷I/O阻塞的進(jìn)程數(shù)(通常是磁盤(pán)I/O)。它展示了一個(gè)資源負(fù)載(或需求)的整體概念,但是無(wú)法理解其中的內(nèi)涵,在沒(méi)有其它工具的情況下。僅僅是一種快速查看手段而已。

這三個(gè)數(shù)字呈現(xiàn)出平均負(fù)載在幾何級(jí)減弱,依次表示持續(xù)1分鐘,5分鐘和15分鐘內(nèi)。這三個(gè)數(shù)字能告訴我們負(fù)載在時(shí)間線上是如何變化的。舉例說(shuō)明,如果你在一個(gè)問(wèn)題服務(wù)器上執(zhí)行檢查,1分鐘的值遠(yuǎn)遠(yuǎn)低于15分鐘的值,可以判斷出你也許登錄得太晚了,已經(jīng)錯(cuò)過(guò)了問(wèn)題。

在上面的例子中,平均負(fù)載的數(shù)值顯示最近正在上升,1分鐘值高達(dá)30,對(duì)比15分鐘值則是19。這些指標(biāo)值像現(xiàn)在這么大意味著很多情況:也許是CPU繁忙;vmstat 或者 mpstat 將可以確認(rèn),本系列的第三和第四條命令。

2. 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-r
ss:0kB
[2320864.954447] TCP: Possible SYN flooding on port 7001. Dropping request. Check SNMP cou
nters.

這個(gè)結(jié)果輸出了最近10條系統(tǒng)信息。可以查看到引起性能問(wèn)題的錯(cuò)誤。上面的例子包含了oom-killer,以及TCP丟包。

譯者注:除了error級(jí)的日志,info級(jí)的也要留個(gè)心眼,可能包含一些隱藏信息。

3. 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

vmstat 是一個(gè)獲得虛擬內(nèi)存狀態(tài)概況的通用工具(最早創(chuàng)建于10年前的BSD)。它每一行記錄了關(guān)鍵的服務(wù)器統(tǒng)計(jì)信息。vmstat 運(yùn)行的時(shí)候有一個(gè)參數(shù)1,用于輸出一秒鐘的概要數(shù)據(jù)。第一行輸出顯示啟動(dòng)之后的平均值,用以替代之前的一秒鐘數(shù)據(jù)。現(xiàn)在,跳過(guò)第一行,讓我們來(lái)學(xué)習(xí)并且記住每一列代表的意義。

r:正在CPU上運(yùn)行或等待運(yùn)行的進(jìn)程數(shù)。相對(duì)于平均負(fù)載來(lái)說(shuō),這提供了一個(gè)更好的、用于查明CPU飽和度的指標(biāo),它不包括I/O負(fù)載。注: “r”值大于CPU數(shù)即是飽和。

free: 空閑內(nèi)存(kb)
如果這個(gè)數(shù)值很大,表明你還有足夠的內(nèi)存空閑。包括命令7“free m”,很好地展現(xiàn)了空閑內(nèi)存的狀態(tài)。

si, so: swap入/出。如果這個(gè)值非0,證明內(nèi)存溢出了。

us, sy, id, wa, st:它們是CPU分類(lèi)時(shí)間,針對(duì)所有CPU的平均訪問(wèn)。分別是用戶(hù)時(shí)間,系統(tǒng)時(shí)間(內(nèi)核),空閑,I/O等待時(shí)間,以及被偷走的時(shí)間(其它訪客,或者是Xen)。CPU分類(lèi)時(shí)間將可以幫助確認(rèn),CPU是否繁忙,通過(guò)累計(jì)用戶(hù)系統(tǒng)時(shí)間。等待I/O的情形肯定指向的是磁盤(pán)瓶頸;這個(gè)時(shí)候CPU通常是空閑的,因?yàn)槿蝿?wù)被阻塞以等待分配磁盤(pán)I/O。你可以將等待I/O當(dāng)作另一種CPU空閑,一種它們?yōu)槭裁纯臻e的解釋線索。

系統(tǒng)時(shí)間對(duì)I/O處理非常必要。一個(gè)很高的平均系統(tǒng)時(shí)間,超過(guò)20%,值得深入分析:也許是內(nèi)核處理I/O非常低效。在上面的例子中,CPU時(shí)間幾乎完全是用戶(hù)級(jí)的,與應(yīng)用程序級(jí)的利用率正好相反。所有CPU的平均利用率也超過(guò)90%。這不一定是一個(gè)問(wèn)題;還需檢查“r”列的飽和度。

4. 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
[...]

這個(gè)命令可以按時(shí)間線打印每個(gè)CPU的消耗,常常用于檢查不均衡的問(wèn)題。如果只有一個(gè)繁忙的CPU,可以判斷是屬于單進(jìn)程的應(yīng)用程序。

5. 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 有一點(diǎn)像頂級(jí)視圖-針對(duì)每一個(gè)進(jìn)程,但是輸出的時(shí)候滾屏,而不是清屏。它非常有用,特別是跨時(shí)間段查看的模式,也能將你所看到的信息記錄下來(lái),以利于進(jìn)一步的研究。上面的例子識(shí)別出兩個(gè) java 進(jìn)程引起的CPU耗盡?!埃PU” 是對(duì)所有CPU的消耗;1591% 顯示 java 進(jìn)程占用了幾乎16個(gè)CPU。

6. 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
[...]

這是一個(gè)理解塊設(shè)備(磁盤(pán))極好的工具,不論是負(fù)載評(píng)估還是作為性能測(cè)試成績(jī)。

r/s, w/s, rkB/s, wkB/s: 這些是該設(shè)備每秒讀%、寫(xiě)%、讀Kb、寫(xiě)Kb??捎糜诿枋龉ぷ髫?fù)荷。一個(gè)性能問(wèn)題可能只是簡(jiǎn)單地由于一個(gè)過(guò)量的負(fù)載引起。

await: I/O平均時(shí)間(毫秒)
這是應(yīng)用程序需要的時(shí)間,它包括排隊(duì)以及運(yùn)行的時(shí)間。
遠(yuǎn)遠(yuǎn)大于預(yù)期的平均時(shí)間可以作為設(shè)備飽和,或者設(shè)備問(wèn)題的指標(biāo)。

avgqu-sz: 向設(shè)備發(fā)出的平均請(qǐng)求數(shù)。
值大于1可視為飽和(盡管設(shè)備能對(duì)請(qǐng)求持續(xù)運(yùn)行,特別是前端的虛擬設(shè)備-后端有多個(gè)磁盤(pán))。

%util: 設(shè)備利用率
這是一個(gè)實(shí)時(shí)的繁忙的百分比,顯示設(shè)備每秒鐘正在進(jìn)行的工作。值大于60%屬于典型的性能不足(可以從await處查看),盡管它取決于設(shè)備。值接近100% 通常指示飽和。如果存儲(chǔ)設(shè)備是一個(gè)前端邏輯磁盤(pán)、后掛一堆磁盤(pán),那么100%的利用率也許意味著,一些已經(jīng)處理的I/O此時(shí)占用100%,然而,后端的磁盤(pán)也許遠(yuǎn)遠(yuǎn)沒(méi)有達(dá)到飽和,其實(shí)可以承擔(dān)更多的工作。

切記:磁盤(pán)I/O性能低并不一定是應(yīng)用程序問(wèn)題。許多技術(shù)一貫使用異步I/O,所以應(yīng)用程序并不會(huì)阻塞,以及遭受直接的延遲(例如提前加載,緩沖寫(xiě)入)。

7. free m

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

buffers: buffer cache,用于塊設(shè)備I/O。
cached:page cache, 用于文件系統(tǒng)。

我們只是想檢查這些指標(biāo)值不為0——那樣意味著磁盤(pán)I/O高、性能差(確認(rèn)需要用iostat)。上面的例子看起來(lái)不錯(cuò),每一類(lèi)內(nèi)存都有富余。

“-/+ buffers/cache”: 提供了關(guān)于內(nèi)存利用率更加準(zhǔn)確的數(shù)值。

Linux可以將空閑內(nèi)存用于緩存,并且在應(yīng)用程序需要的時(shí)候收回。所以應(yīng)用到緩存的內(nèi)存必須以另一種方式包括在內(nèi)存空閑的數(shù)據(jù)里面。有一個(gè)網(wǎng)站linux ate my ram,專(zhuān)門(mén)探討這個(gè)困惑。它還有更令人困惑的地方,如果在Linux上使用ZFS,正如我們運(yùn)行一些服務(wù),ZFS擁有自己的文件系統(tǒng)緩存,也不能在free -m 的輸出里正確反映。這種情況會(huì)顯示系統(tǒng)空閑內(nèi)存不足,但是內(nèi)存實(shí)際上可用,通過(guò)回收 ZFS 的緩存。

關(guān)于 Linux 內(nèi)存管理的更多內(nèi)容,可以閱讀操作系統(tǒng)原理:How Linux Works (Memroy)

8. 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

使用這個(gè)工具用來(lái)檢查網(wǎng)絡(luò)接口吞吐量:rxkB/s 和** txkB/s**, 作為負(fù)載的一種度量方式, 也可以用來(lái)檢查是否已經(jīng)達(dá)到某種瓶頸。

在上面的例子中,網(wǎng)卡 eth0 收包大道 22 Mbytes/s, 即176 Mbits/sec (就是說(shuō),在 1 Gbit/sec 的限制之內(nèi))。此版本也有一個(gè)體現(xiàn)設(shè)備利用率的 “%ifutil” (兩個(gè)方向最大值),我們也可以使用 Brendan的nicstat 工具來(lái)度量。和 nicstat 類(lèi)似,這個(gè)值很難準(zhǔn)確獲取,看起來(lái)在這個(gè)例子中并沒(méi)有起作用(0.00)。

9. 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

這是一個(gè)關(guān)鍵TCP指標(biāo)的概覽視圖。包括:
active/s: 本地初始化的 TCP 連接數(shù) /每秒(例如,通過(guò)connect() )
passive/s: 遠(yuǎn)程初始化的 TCP 連接數(shù)/每秒(例如,通過(guò)accept() )
retrans/s: TCP重發(fā)數(shù)/每秒

這些活躍和被動(dòng)的計(jì)數(shù)器常常作為一種粗略的服務(wù)負(fù)載度量方式:新收到的連接數(shù) (被動(dòng)的),以及下行流量的連接數(shù) (活躍的)。這也許能幫助我們理解,活躍的都是外向的,被動(dòng)的都是內(nèi)向的,但是嚴(yán)格來(lái)說(shuō)這種說(shuō)法是不準(zhǔn)確的(例如,考慮到“本地-本地”的連接)。重發(fā)數(shù)是網(wǎng)絡(luò)或服務(wù)器問(wèn)題的一個(gè)標(biāo)志;它也許是因?yàn)椴豢煽康木W(wǎng)絡(luò)(如,公共互聯(lián)網(wǎng)),也許是由于一臺(tái)服務(wù)器已經(jīng)超負(fù)荷、發(fā)生丟包。
上面的例子顯示每秒鐘僅有一個(gè)新的TCP連接。

10. 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

top命令包含了許多我們之前已經(jīng)檢查的指標(biāo)。它可以非常方便地運(yùn)行,看看是否任何東西看起來(lái)與從前面的命令的結(jié)果完全不同,可以表明負(fù)載指標(biāo)是不斷變化的。頂部下面的輸出,很難按照時(shí)間推移的模式查看,可能使用如 vmstat 和 pidstat 等工具會(huì)更清晰,它們提供滾動(dòng)輸出。如果你保持輸出的動(dòng)作不夠快 (CtrlS 要暫停,CtrlQ 繼續(xù)),屏幕將清除,間歇性問(wèn)題的證據(jù)也會(huì)丟失。

總結(jié)

故障檢查過(guò)程中,人的作用主要是作出決策。遺忘、遺漏、麻痹、松懈是每個(gè)人都會(huì)犯的錯(cuò)誤,好的公司都會(huì)根據(jù)經(jīng)驗(yàn)編制檢查單,提高工作效率,降低人為失誤發(fā)生的概率。出于競(jìng)爭(zhēng)因素考慮,應(yīng)該充分重視檢查單的更新、完善、自動(dòng)化,以此為基礎(chǔ)建立自己的技術(shù)壁壘。

擴(kuò)展閱讀:Linux 操作系統(tǒng)

推薦:電子書(shū)《Linux Perf Master》

發(fā)表在GitBook平臺(tái),歡迎訂閱、下載、批評(píng)指正: https://www.gitbook.com/book/riboseyim/linux-perf-master/details

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容