導航:首頁 > 編程系統 > linux綁定cpu命令

linux綁定cpu命令

發布時間:2023-05-17 06:57:11

linux查看中斷綁定在哪個cpu

cpuset 允許把所有進程echo到一個cpuset目錄中,與指定的回cpu綁定。答 The following script which is a starting point for investigating willmove all the processes to a specific cpuset with one cpu. if [ ! -d /sys/fs/cgroup ]; then echo...

② linux核隔離綁定區別

Linux核隔離和綁定都桐碧是Linux內核對進程和CPU資源的管局銀舉理機制,但是它們的概念和作用有所不同。

1. 核隔離(CPU isolation):核隔離是指將CPU核心綁定到一個或多個特定進程上,從而實現不同進程之間的CPU資源隔離,避免不同進程之間的CPU競爭,並提高CPU利用率。這種方法需要使用cpuset控制工具進行設置,用於分配CPU資源給指定的進程組。

2. 綁定(CPU affinity):綁定是指將一個或多個特定的CPU核心分配給某個進程或線程,使其只能在該CPU核心上運行,其他CPU核心不參與該進程或線程的調度。通過綁定CPU核心可以避免緩存變冷、頁表失效等問題,提高CPU緩存命中率和應用程序性能。這種方法需要使用taskset命令來實現。

總之,在不同的應用場景搏廳下,可根據需求選擇不同的CPU資源管理機制,以便更好地管理和利用CPU資源。

③ linux下把進程/線程綁定到特定cpu核上運行

你那個是系統下把CPU的核說釘在五河以下是比較好的,因為吧和內心壓力非常大,發熱量非常大。

④ 如何監控linux 伺服器 cpu命令

cat /proc/cpuinfo中的信息
processor 邏輯處理器的id。
physical id 物理封裝的處理器的id。
core id 每個核心的id。
cpu cores 位於相同物理封裝的處理器中的內核數量。
siblings 位於相同物理封裝的處理器中的邏輯處理器的數量。

1 查看物理CPU的個數
#cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc –l
2、 查看邏輯CPU的個數
#cat /proc/cpuinfo |grep "processor"|wc –l
3、 查看CPU是幾核
#cat /proc/cpuinfo |grep "cores"|uniq
4、 查看CPU的主頻
#cat /proc/cpuinfo |grep MHz|uniq
5、 # uname -a
6、 Linux euis1 2.6.9-55.ELsmp #1 SMP Fri Apr 20 17:03:35 EDT 2007 i686 i686 i386 GNU/Linux
(查看當前操作系統內核信息)
7、 # cat /etc/issue | grep Linux
8、 Red Hat Enterprise Linux AS release 4 (Nahant Update 5(查看當前操作系統發行版信息)
9、 # cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
8 Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
(看到有8個邏輯CPU, 也知道了CPU型號)
9 # cat /proc/cpuinfo | grep physical | uniq -c
4 physical id : 0
4 physical id : 1
(說明實際上是兩顆4核的CPU)

10、# getconf LONG_BIT
32
(說明當前CPU運行在32bit模式下, 但不代表CPU不支持64bit)

11、# cat /proc/cpuinfo | grep flags | grep ' lm ' | wc –l
8(結果大於0, 說明支持64bit計算. lm指long mode, 支持lm則是64bit)

12、如何獲得CPU的詳細信息:
linux命令:cat /proc/cpuinfo
13、用命令判斷幾個物理CPU,幾個核等:
邏輯CPU個數:
# cat /proc/cpuinfo | grep "processor" | wc -l
物理CPU個數:
# cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
14、每個物理CPU中Core的個數:
# cat /proc/cpuinfo | grep "cpu cores" | wc -l
15、是否為超線程?如果有兩個邏輯CPU具有相同的」core id」,那麼超線程是打開的。每個物理CPU中邏輯CPU(可能是core, threads或both)的個數:
# cat /proc/cpuinfo | grep "siblings"

1.查看CPU信息命令
cat /proc/cpuinfo
2.查看內存信息命令
cat /proc/meminfo
3.查看硬碟信息命令
fdisk -l

查看CPU信息(型號)
# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
8 Intel(R) Xeon(R) CPU E5410 @ 2.33GHz
(看到有8個邏輯CPU, 也知道了CPU型號)

# cat /proc/cpuinfo | grep physical | uniq -c
4 physical id : 0
4 physical id : 1
(說明實際上是兩顆4核的CPU)
PS:Jay added on 10th, May, 2011
# 其實是可能有超線程HT技術,不一定是有4核,也可能是2核4線程;當時還理解不清楚

# getconf LONG_BIT
32
(說明當前CPU運行在32bit模式下, 但不代表CPU不支持64bit)

#

⑤ Linux裡面ps -eo comm,pcpu命令作用是什麼

# ps -ef 顯示所有進程
# ps -eo comm,pcpu 顯圓敗示所有命令佔用的cpu的大小
e顯示所有進程,o指定命令的名字
# ps -eo comm,pmem 顯示所有命令佔用的mem的大小
ps工具標識進程的橘螞顫5種狀態碼:
D 不可中斷 uninterruptible sleep (usually IO)
R 運行 runnable (on run queue)
S 中斷 sleeping
T 停止 traced or stopped
Z 僵死 a defunct (」zombie」物乎) process

⑥ linux cpu隔離和qemu中cpu綁定試驗

查看當前qemu進程(pid:1406)的cpu(psr)使用情況:

$ps -o pid,command,psr -q 1406

proc文件系統中cpu允許調度信息

$cat /proc/1406/status    

Cpus_allowed: 8

Cpus_allowed_list:      3

綁定至某個cpu:

$taskset -cp 2 1406

cpu隔歲培離(獨占)試驗:

在linux啟動時加isocpu即可:

kernel ....  root=...  isolcpu=2,3

啟動時,默認進程乎渣唯就不會調度到2,3號cpu上

再加上前梁隱面的taskset,就可以控制某些cpu個某些進程獨占

⑦ linux下怎麼解除中斷和cpu綁定

在多 CPU 的環境中,還有一個中斷平衡的問題,比如,網卡中斷會教給哪個 CPU 處理,這個內參數控制哪些容 CPU 可以綁定 IRQ 中斷。其中的 {number} 是對應設備的中斷編號,可以用下面的命令找出: cat /proc/interrupt 比如,一般 eth0 的 IRQ

⑧ linux中查看虛擬內存和cpu佔用率的命令是什麼

top,free,cat/proc/meminfo,cat/proc/cpuinfo。

[root@centerlisdbproc]#dmidecode|grep-A16"MemoryDevice"|more[objectObject]。

查看內存使用情況:cat/proc/meminfo,查看CPU使用情況:cat /proc/cpuinfo。

在系統維護的過程中,隨時可能有需要查看 CPU 使用率,並根據相應信息分析系統狀況的需要。在 CentOS 中,可以通過 top 命令來查看 CPU 使用狀況。

運行 top 命令後,CPU 使用狀態會以全屏的方式顯示,並且會處在對話的模式 -- 用基於 top 的命令,可以控制顯示方式等等。退出 top 的命令為 q (在 top 運行中敲 q 鍵一次)。

top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源佔用狀況,類似於Windows的任務管理器。

可以直接使用top命令後,查看%MEM的內容。可以選擇按進程查看或者按用戶查看,如想查看oracle用戶的進程內存使用情況的話可以使用如下的命令:$ top -u oracle。

(8)linux綁定cpu命令擴展閱讀:

一、查看內存佔用:

1、free

# free -m。

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

# free -h。

以GB為單位顯示內存使用情況。

# free -t。

以總和的形式查詢內存的使用信息。

# free -s 5。

周期性的查詢內存使用信息。

每5秒執行一次命令。

二、查看CPU使用情況:

1、top。

top後鍵入P看一下誰佔用最大。

# top -d 5。

周期性的查詢CPU使用信息。

每5秒刷新一次。

2、ps auxw(查看本機的進程所佔cpu和mem的百分比情況)。

使用"ps auxw" 可以查看到本機的進程所佔cpu和mem的百分比情況。

# ps auxw | head -1

%CPU 進程的cpu佔用率。

%MEM 進程的內存佔用率。

3、查看本機所有進程的CPU佔比之和。

# cat cpu_per.sh

三、查看cpu信息(信息記錄在/proc/cpuinfo中)

# 總核數 = 物理CPU個數 X 每顆物理CPU的核數。

# 總邏輯CPU數 = 物理CPU個數 X 每顆物理CPU的核數 X 超線程數。



⑨ 將進程綁定到指定的CPU上

背景:為什麼要進程綁定到指定的CPU上?

1) 減少CPU切換開銷

CPU固定綁定到主機的指定CPU上,在整個運行期間,不會發生CPU浮動, 減少CPU切換開銷 ,提高虛擬機的計算性能。

2) 提供CPU cache的命中率

在多核運行的機器上,每個CPU自身會有緩存,緩存著進程使用的信息,而進程可能會被OS調度到其他CPU上,如此, CPU cache命中率 就低了,當綁定CPU後,程序就會一直在指定的cpu跑,不會由操作系統調度到其他CPU上,性能有一定的提高。

taskset:設置或頌肆檢索進程的CPU相關性

1) 如果沒有taskset命令, 安裝 包含taskset命令的util-linux工具集:yum install util-linux

2) 查看進程的CPU親和力 ,-p選項是一個十六進制數,-cp選項是一個cpu列表,表示相應的cpu核。3的二進制形式是0011,相應的第0位和第1位都是1,表示14795進程只能運行在cpu的第0個核和第1個核。

$ taskset -p 14795

pid 14795's current affinity mask: 3

$ taskset -cp 14795

pid 14795's current affinity list: 0,1

3) 綁定CPU : taskset -cp <CPU IDs>  <Process ID>

$ taskset -cp  0  14795

pid 14795's current affinity list: 0,1

pid 14795's new affinity list: 0

OpenStack K版本引入了許多CPU高級特性功能,不僅支持自定義CPU拓撲功能,支持設置虛擬機CPU的socket、core、threads等,還支持CPU pinning功能,即CPU核綁定,甚至能夠配置虛擬機獨占物理CPU,虛擬機的vCPU能夠固定綁定到物理宿主機的指定pCPU上,在整個運行期間,不會發生CPU浮動,減少CPU切換開銷,提高虛擬機的計算性能。

$ lscpu

Architecture:          x86_64

CPU op-mode(s):        32-bit, 64-bit

Byte Order:            Little Endian

CPU(s):                40

On-line CPU(s) list:  0-39

Thread(s) per core:    2

Core(s) per socket:    10

Socket(s):            2

NUMA node(s):          2

Vendor ID:            GenuineIntel

CPU family:            6

Model:                63

Model name:            Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz

Stepping:              2

CPU MHz:              1201.480

BogoMIPS:              4603.87

Virtualization:        VT-x

L1d cache:            32K

L1i cache:         則掘   32K

L2 cache:              256K

L3 cache:              25600K

NUMA node0 CPU(s):    0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38

NUMA node1 CPU(s):    1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39

以上可知,該宿主機有兩個CPU(socket),每個CPU 10核(core),每個核可以開啟兩個 超線程(thread) ,即有40個邏輯CPU。宿主機CPU包孫櫻核含兩個NUMA node,其中node0包括0,2,4,...,38,node1包括1,3,5,...,39。

步驟1) 創建支持綁核的主機集合

不是所有的計算節點都支持CPU綁核特性,可以通過主機集合(host aggregate)把支持綁核CPU的主機放到一個集合中。

步驟2)  創建支持綁核的flavor

目前Nova並不支持啟動時直接指定主機集合的metadata(hint只支持指定server group),需要通過flavor的擴展屬性和主機集合的metadata匹配,將不匹配的主機濾掉,部署到匹配的主機上。flavor支持配置虛擬機的CPU拓撲、QoS、CPU pinning策略、NUMA拓撲以及PCI passthrough等擴展屬性。

步驟3) 通過步驟2) 的Flavor創建虛擬機,創建完成到虛機所在物理機上查看虛機綁核情況:

查詢方法1) virsh mpxml 虛機id

<vcpu placement='static'>8</vcpu>

<cputune>

<vcpupin vcpu='0' cpuset='25'/>

<vcpupin vcpu='1' cpuset='5'/>

<vcpupin vcpu='2' cpuset='8'/>

<vcpupin vcpu='3' cpuset='28'/>

<vcpupin vcpu='4' cpuset='9'/>

<vcpupin vcpu='5' cpuset='29'/>

<vcpupin vcpu='6' cpuset='24'/>

<vcpupin vcpu='7' cpuset='4'/>

<emulatorpin cpuset='4-5,8-9,24-25,28-29'/>

</cputune>

查詢方法2) 在虛擬機所運行的物理宿主機上執行virsh list找到相應虛機的實例id,然後virsh vcpupin 實例id可以查到該虛擬機所佔用的CPU具體核數。

# virsh vcpupin vm46  綁核的虛機

VCPU: CPU Affinity

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

  0: 25

  1: 5

  2: 8

  3: 28

  4: 9

  5: 29

  6: 24

  7: 4

# virsh vcpupin vm6 未綁核的虛機

VCPU: CPU Affinity

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

  0: 0-39 

  1: 0-39

  2: 0-39 

  3: 0-39

  4: 0-39 

  5: 0-39

  6: 0-39 

  7: 0-39

virsh vcpupin 子命令是KVM自帶的指令工具,它可以把vm實例的每個vcpu與宿主機的cpu對應綁定,這種綁定方式粒度更小。

# virsh vcpupin vm4 查看綁定情況

VCPU: CPU Affinity

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

  0: 0-23     

  1: 0-23

#默認2個vcpu沒有進行綁定,可以在0-23號cpu上切換

# virsh vcpuinfo vm4 查看CPU使用時長

VCPU:          0

CPU:            10  #運行在10號cpu上

State:          running

CPU time:      14.2s

CPU Affinity:  yyyyyyyyyyyyyyyyyyyyyyyy

VCPU:          1

CPU:            8      #運行在8號cpu上

State:          running

CPU time:      6.8s

CPU Affinity:  yyyyyyyyyyyyyyyyyyyyyyyy

# virsh vcpupin vm4 0 3 綁定虛機的第1個CPU到宿主機的第4號cpu上

# virsh vcpupin vm4 1 5 綁定虛機的第2個CPU到宿主機的第6號cpu上

# virsh vcpuinfo vm4

VCPU:          0

CPU:            3

State:          running

CPU time:      14.5s

CPU Affinity:  ---y--------------------

VCPU:          1

CPU:            5

State:          running

CPU time:      7.3s

CPU Affinity:  -----y------------------

# virsh vcpupin vm4

VCPU: CPU Affinity

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

  0: 3

  1: 5

三種方法的相同點:都能實現綁核效果

優劣勢對比:openstack支持虛機重生虛擬遷移到其他物理主機上,第1種方法在這些操作後綁核還是有效的,但2和3就不會綁核的。此外,第1種方法是自動的,2和3是手動的,可以作為臨時補救方法。

在虛擬機上執行高密度計算,測試的Python腳本如下:

# test_compute.py

k = 0

for i in xrange(1, 100000):

    for j in xrange(1, 100000):

        k = k + i * j

使用shell腳本同時跑50個進程,保證CPU滿載運行:

for i in `seq 1 50`; do

    python test_compute.py &

done

使用sar命令查看宿主機CPU使用情況:

sar -P ALL 1 100

結果如下:

Linux 3.10.0-229.20.1.el7.x86_64 (8409a4dcbe1d11af)    05/10/2018      _x86_64_        (40 CPU)

10:20:14 PM    CPU    %user    %nice  %system  %iowait    %steal    %idle

10:20:15 PM    all    20.48      0.00      0.15      0.03      0.00    79.34

10:20:15 PM      0      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      1      0.99      0.00      0.00      0.00      0.00    99.01

10:20:15 PM      2      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      3      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      4    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      5    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      6      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      7      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      8    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      9    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      10      1.01      0.00      0.00      0.00      0.00    98.99

10:20:15 PM      11      1.00      0.00      0.00      0.00      0.00    99.00

10:20:15 PM      12      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      13      0.00      0.00      0.99      0.00      0.00    99.01

10:20:15 PM      14      0.99      0.00      0.99      0.00      0.00    98.02

10:20:15 PM      15      1.00      0.00      0.00      0.00      0.00    99.00

10:20:15 PM      16      0.99      0.00      0.99      0.00      0.00    98.02

10:20:15 PM      17      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      18      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      19      3.96      0.00      0.99      0.00      0.00    95.05

10:20:15 PM      20      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      21      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      22      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      23      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      24    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      25    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      26      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      27      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      28    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      29    100.00      0.00      0.00      0.00      0.00      0.00

10:20:15 PM      30      2.00      0.00      0.00      0.00      0.00    98.00

10:20:15 PM      31      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      32      2.97      0.00      0.99      0.00      0.00    96.04

10:20:15 PM      33      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      34      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      35      1.00      0.00      0.00      0.00      0.00    99.00

10:20:15 PM      36      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      37      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      38      0.00      0.00      0.00      0.00      0.00    100.00

10:20:15 PM      39      0.00      0.00      0.00      0.00      0.00    100.00

從CPU使用情況看宿主機的pCPU 4-5,8-9,24-25,28-29使用率100%,並且整個過程中沒有浮動,符合我們的預期結果,說明CPU核綁定成功。

⑩ Linux 如何綁定指定線程在某個固定CPU上

大概的介紹一下Linux 的指定CPU運行,包括進程和線程。linux下的命令是可以查看當前的cpu的運行狀態,按1可以查看系統有多少個CPU,以及每個CPU的運行狀態。
可是如何查看線程的CPU呢?top
-Hp pid,pid就是你當前程序的進程號,如果是多線程的話,是可以查看進程內所有線程的CPU和內存使用情況。

pstree可以查看主次線程,同樣的pstree -p pid。可以查看進程的線程情況。

taskset這個其實才是重點,可以查看以及設置當前進程或線程運行的CPU(設置親和力)。

taskset -pc pid,查看當前進程的cpu,當然有的時候不只是一個,taskset -pc cpu_num pid ,cpu_num就是設置的cpu。

這樣的話基本的命令和操作其實大家都知道了,接下來就是在代碼中完成這些操作,並通過命令去驗證代碼的成功率。

進程制定CPU運行:

[cpp] view plain
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/sysinfo.h>
#include<unistd.h>
#define __USE_GNU
#include<sched.h>
#include<ctype.h>
#include<string.h>

int main(int argc, char* argv[])
{
//sysconf獲取有幾個CPU
int num = sysconf(_SC_NPROCESSORS_CONF);
int created_thread = 0;
int myid;
int i;
int j = 0;

//原理其實很簡單,就是通過cpu_set_t進行位與操作
cpu_set_t mask;
cpu_set_t get;

if (argc != 2)
{
printf("usage : ./cpu num\n");
exit(1);
}

myid = atoi(argv[1]);

printf("system has %i processor(s). \n", num);

//先進行清空,然後設置掩碼
CPU_ZERO(&mask);
CPU_SET(myid, &mask);

//設置進程的親和力
if (sched_setaffinity(0, sizeof(mask), &mask) == -1)
{
printf("warning: could not set CPU affinity, continuing...\n");
}
while (1)
{

CPU_ZERO(&get);
//獲取當前進程的親和力
if (sched_getaffinity(0, sizeof(get), &get) == -1)
{
printf("warning: cound not get cpu affinity, continuing...\n");
}
for (i = 0; i < num; i++)
{
if (CPU_ISSET(i, &get))
{
printf("this process %d is running processor : %d\n",getpid(), i);
}
}
}
return 0;
}

進程設置CPU運行,其實只能是單線程。多線程設定CPU如下:

[cpp] view plain
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sched.h>

void *myfun(void *arg)
{
cpu_set_t mask;
cpu_set_t get;
char buf[256];
int i;
int j;
//同樣的先去獲取CPU的個數
int num = sysconf(_SC_NPROCESSORS_CONF);
printf("system has %d processor(s)\n", num);

for (i = 0; i < num; i++) {
CPU_ZERO(&mask);
CPU_SET(i, &mask);
//這個其實和設置進程的親和力基本是一樣的
if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {
fprintf(stderr, "set thread affinity failed\n");
}
CPU_ZERO(&get);
if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) {
fprintf(stderr, "get thread affinity failed\n");
}
for (j = 0; j < num; j++)
{
if (CPU_ISSET(j, &get))
{
printf("thread %d is running in processor %d\n", (int)pthread_self(), j);
}
}
j = 0;
while (j++ < 100000000) {
memset(buf, 0, sizeof(buf));
}
}
pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
pthread_t tid;
if (pthread_create(&tid, NULL, (void *)myfun, NULL) != 0)
{
fprintf(stderr, "thread create failed\n");
return -1;
}
pthread_join(tid, NULL);
return 0;
}

閱讀全文

與linux綁定cpu命令相關的資料

熱點內容
什麼是3G網路3G的發展史 瀏覽:269
如何使用ps把圖片的文件大小弄小 瀏覽:880
安卓系統根目錄文件夾 瀏覽:900
手錶怎麼設置蜂窩網路 瀏覽:51
舊愛勾搭app還有嗎 瀏覽:141
日外語言編程軟體哪個好 瀏覽:950
小論文發表了但是數據錯誤怎麼辦 瀏覽:952
注冊表禁止啟動程序運行 瀏覽:705
網路優化總體流程圖 瀏覽:735
前端程序員簡歷模板 瀏覽:706
蜂巢積木編程機器人怎麼樣 瀏覽:561
微信小程序tips 瀏覽:117
油印文件有哪些 瀏覽:854
java線程買票案例 瀏覽:672
java架構培訓 瀏覽:857
price是什麼文件 瀏覽:258
手機游戲編程哪個好學 瀏覽:259
qq郵箱怎麼發語音文件 瀏覽:494
php刪除資料庫記錄 瀏覽:905
文件校驗工具有哪些 瀏覽:158

友情鏈接