linux性能監控命令,磁盤,網絡,cpu,內存


一,CPU

cpu負載是邏輯的判斷與處理(類似人的大腦),

CPU 主要是運行程序的速度,影響速度的主要是主頻(越高越快,但不是線性關系)、外頻(基准頻率、外頻決定整個主板運行速度,超頻就是超外頻,超頻會導致不穩定)、緩存容量(緩存的大小對cpu速度影響很大,緩存大,命中率高,速度就快,L1緩存與處理器同頻運行,二級緩存內部和主頻相同,外部是主頻的一半,但比內存快得多)、邏輯結構

查看指令:

1,cat /proc/cpuinfo

2,top

使用格式: top [-] [d] [p] [q] [c] [C] [S] [s] [n] 參數說明: d:指定每兩次屏幕信息刷新之間的時間間隔。當然用戶可以使用s:交互命令來改變之。 p:通過指定監控進程ID來僅僅監控某個進程的狀態。 i:使top不顯示任何閑置或者僵死進程。 c:顯示整個命令行而不只是顯示命令名

 

 

top 運行中內部命令如下:

s – 改變畫面更新頻率

l – 關閉或開啟第一部分第一行 top 信息

t – 關閉或開啟第一部分第二行 Tasks 和第三行 Cpus 信息

m – 關閉或開啟第一部分第四行 Mem 和 第五行 Swap 信息

N – 以 PID 的大小的順序排列表示進程列表

P – 以 CPU 占用率大小的順序排列進程列表

M – 以內存占用率大小的順序排列進程列表

T – 按消耗cpu時間排序

h – 顯示幫助

n – 設置在進程列表所顯示進程的數量

q – 退出 top

= - 移除所有任務顯示限制

H - 切換線程和進程模式

U - 指定用戶相關進程

r - 重新設定進程的nice值

W - 存儲當前設定

top 信息詳解:

 當前系統時間   啟動時間長度 3個用戶 最近5、10、15分鍾平均負載----cpu+io等待

 進程 總共192個進程  1個運行 191個休眠  0個停止  0個僵屍(進程的一種狀態)

%us 用戶進程的cpu時間 %sy系統內核進程的cpu時間 %ni niced:運行已調整優先級的用戶進程的CPU時間 %wa IO wait: 用於等待IO完成的CPU時間 %hi hi:處理硬件中斷的CPU時間 %si: 處理軟件中斷的CPU時間 %st:強制上下文切換消耗的cpu時間

 Mem 總物理內存   used 使用內存    free剩余內存  buffers 緩沖區 存放將要寫入磁盤的數據

Swap 虛擬內存 一小部分內存和一大部分磁盤一起虛擬出來的空間 total 總虛擬內存 Free 空閑虛擬內存 持續減少一點是內存有瓶頸了(物理內存不夠用) Cached 緩存區,是高速緩存,cpu頻繁讀的數據放入緩存區 , 從Cache中讀取數據會更快,減少了CPU等待的時間,提高了系統的性能。

 

PID:進程ID,進程的唯一標識符

USER:進程所有者的實際用戶名。

PR:進程的調度優先級。這個字段的一些值是'rt'。這意味這這些進程運行在實時態。

NI:進程的nice值(優先級)。越小的值意味着越高的優先級。負值表示高優先級,正值表示低優先級,默認20

VIRT:進程使用的虛擬內存。進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES RES:駐留內存大小。駐留內存是任務使用的非交換物理內存大小。進程使用的、未被換出的物理內存大小,單位kb。

RES=CODE+DATA

SHR:SHR是進程使用的共享內存。共享內存大小,單位kb

S:這個是進程的狀態。它有以下不同的值: D - 不可中斷的睡眠態。 R – 運行態 S – 睡眠態 T – 被跟蹤或已停止 Z – 僵屍態

%CPU:自從上一次更新時到現在任務所使用的CPU時間百分比。 %MEM:進程使用的可用物理內存百分比。

TIME+:任務啟動后到現在所使用的全部CPU時間,精確到百分之一秒。

COMMAND:運行進程所使用的命令。進程名稱(命令名/命令行)

VIRT:virtual memory usage 虛擬內存

1、進程“需要的”虛擬內存大小,包括進程使用的庫、代碼、數據等

2、假如進程申請100m的內存,但實際只使用了10m,那么它會增長100m,不是實際使用量

RES:resident memory usage 常駐內存

1、進程當前使用的內存大小,但不包括swap out,包含其他進程的共享

2、如果申請100m的內存,實際使用10m,它只增長10m,與VIRT相反

3、關於庫占用內存的情況,它只統計加載的庫文件所占內存大小

SHR:shared memory 共享內存

1、除了自身進程的共享內存,也包括其他進程的共享內存

2、雖然進程只使用了幾個共享庫的函數,但它包含了整個共享庫的大小

3、計算某個進程所占的物理內存大小公式:RES – SHR

DATA:

1、數據占用的內存。如果top沒有顯示,按s鍵可以顯示出來。

2、真正的該程序要求的數據空間,是真正在運行中要使用的。

top的交互命令:

h 切換到交互命令窗口

1 顯示多核的cpu占用情況

f 進入新試圖 排基本試圖的顯示字段 如 s 顯示data

U 輸入用戶名選項查看對應用戶的進程

K 輸入進程號和信號 終止進程 15普通終止 9 強制終止

b 打開和關閉行高亮

x 打開和關閉排序列高亮

------------------------------------------------------------

cpu高的定位方法:

1、查看那個進程占用CPU高 執行Top

2、查看進程下的那個線程占用CPU高 Top –H –p 進程號

3、按CPU排序-輸入P 定位到那個線程CPU占用高 再查詢此線程執行的方法

------------------------------------------------------------

vmstat的使用方法:

-a:顯示活躍和非活躍內存

-f:顯示從系統啟動至今的fork數量(linux下創建進程調用fork方法) 

-m:顯示slabinfo(內核創建的一些小對象的信息展示)

-n:只在開始時顯示一次各字段名稱。

-s:顯示內存相關統計信息及多種系統活動數量。

delay:刷新時間間隔。如果不指定,只顯示一條結果。

count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數為無窮。

-d:顯示磁盤相關統計信息。

-p:顯示指定磁盤分區統計信息

-S:使用指定單位顯示。參數有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576字節(byte)。默認單位為K(1024 bytes)

-V:顯示vmstat版本信息

vmstat 2 5 :每2秒采集一次,共計采集5次

Procs 進程

r cpu正在運行的進程數,如果超過cpu核數,cpu有瓶頸

b 等待資源的進程數,比如等待io或者cpu運行的進程數,大於0說明cpu有瓶頸

Memory內存

Swpd 虛擬內存已使用的大小,如果大於0,表示你的機器物理內存不足了

Free 空閑的物理內存大小,默認KB

Buff 已經使用的buff大小

Cache 已使用的cache大小

Swap虛擬內存

Si 每秒從虛擬內存寫入內存的大小(KB/s),如果長期大於0,說明內存不足

So 每秒從內存寫到虛擬內存的大小(KB/s),如果長期大於0,說明內存不足

io 磁盤io

Bi 表示由每秒讀入的塊 Bo 表示寫的塊 單位block 硬盤讀寫的最小單位是扇區,一個扇區是512 bytes,一次讀寫的數據量就稱為1個block,基本可以按乘512來根據block計算出讀寫的實際數據量

System

In 表示每秒產生的中斷次數

Cs 每秒產生的上下文切換次數,in和cs越大,表示內存消耗的cpu越多

Cpu

Us 用戶消耗的cpu百分比,如果大於50%需要關注了

Sy 內核消耗的cpu百分比,如果us+sy大於80%需要關注

Id cpu處於空閑時間的百分比

Wa 等待所占的cpu百分比,wa值高,說明io等待嚴重,磁盤有瓶頸,不超20%

St 被動上下文切換消耗cpu時間,如果in、cs和st高的話,可以通過pidstat -wt -u 1 命令查看是主動切換(cswch)還是被動切換(nswch),進一步分析,如果是被動切換比較高,說明是磁盤io有問題

------------------------------sar------------------------------------------

sar(System ActivityReporter系統活動情況報告)是目前Linux上最為全面的系統性能分析工具之一,可以從多方面對系統的活動進行報告,包括:文件的讀寫情況、系統調用的使用情況、磁盤I/O、CPU效率、內存使用狀況、進程活動及IPC有關的活動等,sar命令由sysstat安裝包安裝

用法: sar [ 選項 ] [ <時間間隔> [ <次數> ] ] 選項: [ -A ] [ -B ] [ -b ] [ -C ] [ -d ] [ -H ] [ -h ] [ -p ] [ -q ] [ -R ] [ -r ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -V ] [ -v ] [ -W ] [ -w ] [ -y ] [ -I { <中斷> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ] [ -m { <關鍵詞>

Sar 使用語法:

-A:所有報告的總和

-b:顯示I/O和傳遞速率的統計信息(緩沖區使用情況)

-B:顯示換頁狀態

-d:輸出每一塊磁盤的使用信息

-e:設置顯示報告的結束時間

-q:顯示運行的隊列大小,它與系統當時的平均負載相同

-i:設置狀態信息刷新的間隔時間

-P:報告每個CPU的狀態

-r:顯示內存狀態

–u:輸出cpu使用情況和統計信息

–v:顯示進程、索引節點、文件和其他內核表的狀態

-W:顯示交換分區的狀態

-n:顯示網絡使用情況

這個命令主要是監控cpu的,每2秒收集一次,總共收集3次。等同於sar -p 2 3 

 %usr 用戶進程消耗的cpu時間百分比

%nice 改變過優先級的進程的占用CPU時間的百分比

%system 系統進程消耗的cpu時間百分比

%iowait I/O等待所占cpu時間百分比

%steal (Steal time)是當hypervisor服務另一個虛擬處理器的時候,虛擬CPU等待實際CPU的時間的百分比;高steal值可能意味着主機供應商在服務器上過量地出售虛擬機。steal值還是不降的話,你應該尋找另一家服務供應商。

%idle cpu空閑狀態的時間占比

需要注意的指標:%iowait和%idle,%wio過高表示磁盤I/O瓶頸;%idle值高表示cpu空閑,%idle值持續低於10%,表示cpu存在性能瓶頸

Sar –q 信息詳解-查看cpu性能問題:

Runq-sz 運行隊列的長度(等待運行的進程數,每核的CP不能超過3個)

plist-sz 進程列表中的進程(processes)和線程數(threads)的數量

ldavg-1 最后1分鍾的CPU平均負載,即將多核CPU過去一分鍾的負載相加再除以核心數得出的平均值

ldavg-5 最后5分鍾的CPU平均負載

ldavg-15 最后15分鍾的CPU平均負載

Sar –r 信息詳解—查看內存使用情況:

 Kbmemfree 空閑的物理內存大小

Kbmemused 使用的物理內存

%memused 物理內存使用率(占比)

Kbbuffers 內核中作為緩沖區使用的物理內存大小,kbbuffers和kbcached:這兩個值就是free命令中的buffer和cache以核心數得出的平均值

Kbcached 緩存的文件大小

Kbcommit 保證當前系統正常運行所需要的最小內存,即為了確保內存不溢出而需要的最少內存(物理內存+Swap分區)

%commit 這個值是kbcommit與內存總量(物理內存+swap分區)的一個百分比的值

Sar –B 信息詳解:

Pgpgin/s 表示每秒從磁盤或SWAP置換到內存的字節數(KB)

Pgpgout/s 表示每秒從內存置換到磁盤或SWAP的字節數(KB)

Fault/s 每秒鍾系統產生的缺頁數,即主缺頁與次缺頁之和

Majflt/s 每秒鍾產生的主缺頁數

Pgfree/s 每秒被放入空閑隊列中的頁個數

Pgscank/s 每秒被kswapd掃描的頁個數

Pgscand/s 每秒直接被掃描的頁個數

Pgsteal/s 每秒鍾從cache中被清除來滿足內存需要的頁個數

%vmeff 每秒清除的頁(pgsteal)占總掃描頁(pgscank+pgscand)的百分比

Sar –v 信息詳解:

 Dentunusd 在緩沖目錄條目中沒有使用的條目數量

File-nr 被系統使用的文件句柄數量

Inode-nr 已經使用的索引數量 

Pty –nr 使用的pty數量 這里面的索引和文件句是sysctl.conf里面定義的和內核相關的值, max-file表示系統級別的能夠打開的文件句柄的數量, 可以sysctl  -a | grep file查看,具體含義如下: file-max中指定了系統范圍內所有進程可打開的文件句柄的數量限,當收到"Too many open files in system"這樣的錯誤消息時, 就應該曾加這個值了。

-------------------------IO-------------------------------

Tps 磁盤每秒鍾的IO總數,等於iostat中的tps

Rtps 每秒鍾從磁盤讀取的IO總數

Wtps 每秒鍾從寫入到磁盤的IO總數 

Bread/s 每秒鍾從磁盤讀取的塊總數

Bwrtn/s 每秒鍾此寫入到磁盤的塊總數

一次I/O 當進程發起系統調用時,系統調用就進入內核模式, 然后開始I/O操作 I/O操作分為倆個步驟:           

  1) 磁盤把數據裝載進內核的內存空間        

   2) 內核的內存空間的數據copy到用戶的內存空間中(此過程才是真正I/O發生的地方) 

一次io的詳細處理過程分析:

進程需要對磁盤中的數據進行操作,則會向內核發起一個系統調用,然后此進程,將會被切換出去;此進程會被掛起或者進入睡眠狀態,也叫不可中 斷的睡眠,因為數據還沒有得到,只有等到系統調用的結果完成后,則進程會被喚醒,繼續接下來的操作,從系統調用的開始到系統調用結束經過的步驟:

1,進程向內核發起一個系統調用,

2,內核接到系統調用,知道是對文件的請求,於是告訴磁盤,把文件讀取出來

3,磁盤接收到來着內核的命令后,把文件載入到內核的內存空間里面

4,內核的內存空間接收到數據之后,把數據copy到用戶進程的內存空間(此過程是I/O發生的地方)

5,進程內存空間得到數據后,給內核發送通知

6,內核把接收到的通知回復給進程,此過程為喚醒進程,然后進程得到數據,進行下一步操作

Sar –d 信息詳解—查看磁盤是否有瓶頸:

 Dentunusd 在緩沖目錄條目中沒有使用的條目數量

Tps 每秒I/O的次數

Rd_sec/s 每秒讀扇區的大小

Wr_sec/s 每秒寫扇區的大小

Avgrq-sz 每次操作的I/o大小

Avgqu-sz 磁盤隊列的長度,反映磁盤的繁忙程度

Await 操作磁盤的平均處理時間,等於尋道時間+隊列時間+服務時間(毫秒)

Svctm 每次磁盤處理消耗的時間,不包含隊列時間,不大於0.5,體現磁盤性能

%util I/O請求占用的CPU百分比,值越高,說明I/O越慢

Sar –w 信息詳解-查看內存是否有瓶頸:

Pswpin/s 每秒換入的交換頁面(swap page)數量

Pswpout/s 每秒換出的交換頁面(swap page)數量

----------------------------網絡-----------------------------------------

sar -n DEV 信息詳解-查看網絡瓶頸:

Iface 網卡名稱

Rxpck/s 每秒接收的數據包

Txpck/s 每秒發送的數據包

rxkB/s 每秒接收的字節數,單位kb(重點看)

txkB/S 每秒發送的字節數,單位kb(重點看)

Rxcmp/S 每秒鍾接受的壓縮數據包

Txcmp/S 每秒鍾發送的壓縮包

Rxmcst/S 每秒鍾接收的多播數據包

場景:如果我監控的數據是120000kb,負載機和被壓測的服務器之間的帶寬是1GB(調研所得),壓測結果監控網卡的數據為120000kb,120000KB*8=960000KB,960000KB/1024=937.5Mb,非常接近帶寬

1KB=8kb

1MB=1024KB

1GB=1024MB

sar -n SOCK 信息詳解查看連接數:

Totsck 當前被使用的socket總數

Tcpsck 當前正在被使用的TCP的socket總數

Udpsck 當前正在被使用的UDP的socket總數

Rawsck 當前正在被使用於RAW的skcket總數

Ip-frag 當前的IP分片的數目

Tcp-tw TCP套接字中處於TIME-WAIT狀態的連接數量 

--------------------iostat-----------------

Iostat 使用語法:

用法:iostat [ 選項 ] [ <時間間隔> [ <次數> ]] 常用選項說明:

-c:只顯示系統CPU統計信息,即單獨輸出avg-cpu結果,不包括device結果

-d:單獨輸出Device結果,不包括cpu結果

-k/-m:輸出結果以kB/mB為單位,而不是以扇區數為單位

-x:輸出更詳細的io設備統計信息

interval/count:每次輸出間隔時間,count表示輸出次數,不帶count表示循環輸出

Iostat –x信息詳解:

 %user 用戶進程消耗CPU時間的百分比

%nice 改變過優先級的進程的占用CPU時間的百分比

%system 系統進程消耗的CPU時間的百分比

%iowait I/O等待所占cpu時間百分比

%steal (Steal time)是當hypervisor服務另一個虛擬處理器的時候,虛擬CPU等待實際CPU的時間的百分比,如果高說明虛擬機虛的cpu太多了;

%idle cpu空閑狀態的時間占比

%rrqm/s 每秒進行合並的讀操作次數

%wrqm 每秒進行合並的寫操作次數

%r/s 每秒完成讀的I/O設備的次數

%w/s 每秒完成寫的I/O設備的次數

%rsec/s 每秒讀的扇區

%wsec/s 每秒寫的扇區

Avgrq-sz 每個請求平均大小,單位是扇區數

Avgqu-sz 平均等待處理的io請求隊列長度

Await 每次I/O操作磁盤的平均時間,等待時間+磁盤處理時間,單位毫秒,一般低於5毫秒,大於10毫秒就比較大了

Svctm 平均每次磁盤處理時間,真正的磁盤操作耗時,不包含等待,單位毫秒

%util 一秒鍾用於I/O操作的時間占比,超過80%認為I/O繁忙

Iostat –c 信息詳解:

%user 用戶進程消耗CPU時間的百分比

%nice 改變過優先級的進程的占用CPU時間的百分比

%system 系統進程消耗的CPU時間的百分比

%iowait I/O等待所占cpu時間百分比

%steal (Steal time)是當hypervisor服務另一個虛擬處理器的時候,虛擬CPU等待實際CPU的時間的百分比,如果高說明虛擬機虛的cpu太多了;

%idle cpu空閑狀態的時間占比

Iostat –d 信息詳解:

ps 磁盤每秒鍾的IO總數

Blk_read/s 每秒讀取的數據塊數

Blk_wrtn/s 每秒寫入的數據塊數

Blk_read 讀取的數據塊總數

Blk_wrtn 寫入的數據塊總數

塊是個虛擬出來的概念,操作系統與磁盤打交道的最小單位是磁盤塊。一般是4k大小必須是扇區(512k)的整數倍。操作系統操作磁盤,也需要通過磁盤驅動器進行。所以離不開扇區的;fdisk –l 查看扇區信息

----------------free--------------------

free 命令語法:

參  數:

-b  以Byte為單位顯示內存使用情況。

-k  以KB為單位顯示內存使用情況。

-m  以MB為單位顯示內存使用情況。

-o  不顯示緩沖區調節列。

-s<間隔秒數>  持續觀察內存使用狀況。

-t  顯示內存總和列。

-V  顯示版本信息。

 

total:表示物理內存總量(total = used + free)

used:表示總計分配給緩存(包含buffers 與cache )使用的數量,但其中可能部分緩存並未實際使用

free:未被分配的內存

shared:多個進程的共享內存總和

buffers:系統分配但未被使用的buffers 數量

cached:系統分配但未被使用的cache 數量

-------------------------netstat-------------------

Netstat 使用語法:

語法

netstat [-acCeFghilMnNoprstuvVwx][-A<網絡類型>][--ip]

參數說明:

-a或--all 顯示所有連線中的Socket

-c或--continuous 持續列出網絡狀態

-e或--extend 顯示網絡其他相關信息

-i或--interfaces 僅列出有在listen(監聽)的服務狀態

-n或--numeric 直接使用IP地址,而不通過域名服務器。

-p或--programs 顯示正在使用Socket的程序識別碼和程序名稱。

-r或--route 顯示R路由信息和當前有效連接

-s或--statistice 顯示網絡工作信息統計表,按協議統計

-t或--tcp 顯示TCP傳輸協議的連線狀況

-u或--udp 顯示UDP傳輸協議的連線狀況

 

MTU 表示最大傳輸單元,單位字節

RX-OK/TX-OK 表示已准確地接收/發送了多少數據包(重點)

RX-ERR/ TX-ERR 表示接收/發送數據包時產生了多少錯誤(重點,不能有值,有值就說明有錯誤)

RX-DRP/TX –DRP 表示接收/發送數據包時丟棄了多少數據包(重點,不能有值,有值就說明有錯誤)

RX-OVR/TX-OVR 表示由於誤差而丟失了多少數據包(重點,不能有值,有值就說明有錯誤)

FLG 表示接口標記,其中:

B 已經設置了一個廣播地址

L 該接口是一個回送設備

M 接收所有數據包(混亂模式)

N 避免跟蹤 O 在該接口上,禁止ARP

P 這是一個點到點鏈接

R 接口正在雲

U 接口處於“活動”狀態

RX-ERR/ TX-ERR,RX-DRP/TX –DRP,RX-OVR/TX-OVR 應該為0或者接近0,如果持續很大,網絡質量肯定有問題

Netstat 常用命令:

netstat -an | awk '/^tcp/ {++S[$NF]}  END {for (a in S) print a,S[a]} '

netstat -ap | grep ssh     ----->找出程序運行的端口

netstat -pt  ---->輸出中顯示 TCP連接信息

 ----------------------------uptime------------------------------------

 

 19:31:50  當前時間

up 9 days,  6:55  運行了多久

1 user  運行了1個用戶

Load average  在特定時間間隔內運行隊列中進程數

當單cpu單核時,load averages>1則系統繁忙且面臨崩潰

當單cpu多核時,load averages=1則運行正常,通常我們先看15分鍾load,如果load很高,再看1分鍾和5分鍾負載,查看是否有下降趨勢,1分鍾負載值 > 1,那么我們不用擔心,但是如果15分鍾負載都超過1,我們要趕緊看看發生了什么事情。所以我們要根據實際情況查看這三個值

ps 監測當前進程的情況:

參數:

-A 所有的進程均顯示出來,與 -e 具有同樣的效用

-a 顯示現行終端機下的所有進程,包括其他用戶的進程

-u 以用戶為主的進程狀態 -x 通常與 a 這個參數一起使用,可列出較完整信息

-e 命令之后顯示環境

輸出格式規划:

l 較長、較詳細的將該PID 的的信息列出

j 工作的格式 (jobs format)

-f :做一個更為完整的輸出

ps –aux|more信息詳解:

User 運行進程的用戶

Pid 運行的進程id,kill進程就是k這個id

%CPU 進程占用CPU的百分比

% MEM 進程占用內存的百分比

VSZ 占用的虛擬記憶體大小

RSS 占用的記憶體大小

TTY 終端的次要裝置號碼 (minor device number of tty)

STAT 該行程的狀態 START 進程啟動時間

TIME 進程執行的時間

COMMAND 所執行的指令

-----------------------strace--------------------------------- 

Strace 命令:

常用來跟蹤進程執行的系統調用和接收的信號,linux下,進程不能直接訪問硬件設備,當進程需要訪問硬件設備(比如讀取磁盤文件,接收網絡數據等等)時,必須由用戶態模式切換至內核態模式,通過系統調用訪問硬件設備。strace可以跟蹤到一個進程產生的系統調用,包括參數,返回值,執行消耗時間

常用選項:

-tt 在每行輸出的前面,顯示毫秒級別的時間

-T 顯示每次系統調用所花費的時間

-v 對於某些相關調用,把完整的環境變量,文件stat結構等打出來。

-f 跟蹤目標進程,以及目標進程創建的所有子進程

-e 控制要跟蹤的事件和跟蹤行為,比如指定要跟蹤的系統調用名稱

-o 把strace的輸出單獨寫到指定的文件

-s 當系統調用的某個參數是字符串時,最多輸出指定長度的內容,默認是32個字節

-p 指定要跟蹤的進程pid, 要同時跟蹤多個pid, 重復多次-p選項即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM