一.概念

  在介绍能源等待PAGEIOLATCH此前,先来打探下从实例品级来解析的各样财富等待的dmv视图sys.dm_os_wait_stats。它是重返推行的线程所碰着的有着等待的相关音信,该视图是从二个实在等级来解析的种种等待,它归纳200八系列型的等待,须要关心的包罗PageIoLatch(磁盘I/O读写的等候时间卡塔 尔(英语:State of Qatar),LCK_xx(锁的守候时间卡塔 尔(阿拉伯语:قطر‎,WriteLog(日志写入等待卡塔尔,PageLatch(页上闩锁卡塔尔国Cxpacket(并行等待卡塔 尔(英语:State of Qatar)等以致任何能源等待排前的。 

  1.  上边依据总耗费时间排序来考查,这里解析的等待的wait_type 不包涵以下

SELECT  wait_type ,
        waiting_tasks_count,
        signal_wait_time_ms ,
        wait_time_ms,
        max_wait_time_ms
FROM    sys.dm_os_wait_stats
WHERE   wait_time_ms > 0
        AND wait_type NOT IN ( 'CLR_SEMAPHORE', 'CLR_AUTO_EVENT',
                               'LAZYWRITER_SLEEP', 'RESOURCE_QUEUE',
                               'SLEEP_TASK', 'SLEEP_SYSTEMTASK',
                               'SQLTRACE_BUFFER_FLUSH', 'WAITFOR',
                               'LOGMGR_QUEUE', 'CHECKPOINT_QUEUE',
                               'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT',
                               'BROKER_TO_FLUSH', 'BROKER_TASK_STOP',
                               'CLR_MANUAL_EVENT',
                               'DISPATCHER_QUEUE_SEMAPHORE',
                               'FT_IFTS_SCHEDULER_IDLE_WAIT',
                               'XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN',
                               'SQLTRACE_INCREMENTAL_FLUSH_SLEEP' )
ORDER BY signal_wait_time_ms DESC

  下图排行在前的能源等待是首要要求去关爱解析:

home88一必发 1

  通过下边包车型地铁查询就会找到PAGEIOLATCH_x类型的能源等待,由于是实例级其余总结,想要得到有意义数据,就要求查阅感兴趣的时辰间距。假设要间距来剖判,没有须求重启服务,可经过以下命令来重新载入参数

DBCC SQLPERF ('sys.dm_os_wait_stats', CLEAR);  

  wait_type:等待类型
  waiting_tasks_count:该等待类型的等候数
  wait_time_ms:该等待类型的总等待时间(满含三个经过悬挂状态(Suspend)和可运市价况(Runnable)花销的总时间)
  max_wait_time_ms:该等待类型的最长等待时间
  signal_wait_time_ms:正在守候的线程从选取功率信号通告到其最初运转之间的时差(二个历程可运维状态(Runnable)开销的总时间)
  io等待时间==wait_time_ms – signal_wait_time_ms

一. 概述

 sql server作为关系型数据库,要求开展多少存款和储蓄,
那在运作中就能软磨硬泡的与硬盘进行读写交互作用。假设读写不能够正确神速的成就,就能产出质量难题甚至数据库损坏难点。上面讲讲引起I/O的发生,以致解析优化。

 

二. PAGEIOLATCH_x

  2.1 什么是Latch

    在sql
server里latch是轻量级锁,不相同于lock。latch是用来一齐sqlserver的个中对象(同步资源访谈),而lock是用来对于客商对象包括(表,行,索引等)实行同步,轻巧归纳:Latch用来爱慕SQL server内部的部分能源(如page卡塔尔国的情理访谈,可以感到是八个生机勃勃并对象。而lock则重申逻辑访谈。譬如一个table,正是个逻辑上的概念。关于lock锁那块在”sql server
锁与事务拨云见日”中有详细表明。

  2.2 什么是PageIOLatch 

  当查问的数据页假若在Buffer
pool里找到了,则还未有任何等待。不然就能够产生二个异步io操作,将页面读入到buffer
pool,没做完从前,连接会维持在PageIoLatch_ex(写)或PageIoLatch_sh(读)的等候情形,是Buffer
pool与磁盘之间的守候。它体现了查询磁盘i/o读写的等候时间。
  当sql
server将数据页面从数据文件里读入内部存款和储蓄器时,为了防止万黄金年代其他顾客对内存里的同八个数据页面进行访谈,sql
server会在内部存款和储蓄器的多寡页同上加贰个排它锁latch,而当任务要读取缓存在内部存款和储蓄器里的页面时,会申请二个分享锁,疑似lock同样,latch也会现出拥塞,依据差异的等候财富,等待意况犹如下:PAGEIOLATCH_DT,PAGEIOLATCH_EX,PAGEIOLATCH_KP,PAGEIOLATCH_SH,PAGEIOLATCH_UP。注重关心PAGEIOLATCH_EX(写入)和PAGEIOLATCH_SH(读取)三种等待。

2.1  AGEIOLATCH流程图

  临时大家分析当前移动顾客情形下时,三个有意思的现象是,一时候你意识某些SPID被自身窒碍住了(通过sys.sysprocesses了查看)
为何会协调等待自个儿呢? 那一个得从SQL server读取页的进程提起。SQL
server从磁盘读取二个page的进度如下:

home88一必发 2

home88一必发 3

  (1):由五个客户乞请,获取扫描X表,由Worker x去试行。

  (2):在扫描进程中找到了它必要的数量页同1:100。

  (3):发面页面1:100并不在内部存款和储蓄器中的数据缓存里。

  (4):sql
server在缓冲池里找到叁个可以寄存的页面空间,在上面加EX的LATCH锁,幸免数据从磁盘里读出来在此以前,外人也来读取或改换这么些页面。

  (5):worker x发起多少个异步i/o乞求,供给从数据文件里读出页面1:100。

  (6):由于是异步i/o(能够知晓为四个task子线程),worker
x能够接着做它上面要做的职业,就是读出内部存款和储蓄器中的页面1:100,读取的动作要求提请二个sh的latch。

  (7):由于worker
x在此以前申请了叁个EX的LATCH锁还未自由,所以那几个sh的latch将被窒碍住,worker
x被本人拥塞住了,等待的财富正是PAGEIOLATCH_SH。

  最终当异步i/o结束后,系统会打招呼worker
x,你要的数量现已写入内部存款和储蓄器了。接着EX的LATCH锁释放,worker
x申请获得了sh的latch锁。

总括:首先说worker是叁个进行单元,下边有多少个task关联Worker上,
task是运营的矮小义务单元,能够如此精通worker发生了第一个x的task职责,再第5步发起几个异步i/o须要是第三个task职分。一个task归于一个worker,worker
x被自个儿阻塞住了。 关于任务调解精通查看sql server
任务调度与CPU。

xx(锁的等待时间卡塔尔,假使想要的数据不在内部存款和储蓄器中时home88一必发。 2.2 具体深入分析

  通过上边通晓到要是磁盘的速度无法满意sql
server的急需,它就能形成三个瓶颈,通常PAGEIOLATCH_SH
从磁盘读数据到内部存款和储蓄器,借使内部存款和储蓄器远远不足大,当有内部存款和储蓄器压力时候它会自由掉缓存数据,数据页就不会在内部存款和储蓄器的数码缓存里,那样内部存款和储蓄器难点就招致了磁盘的瓶颈。PAGEIOLATCH_EX是写入数据,那貌似是磁盘的写入速度显著跟不上,与内部存款和储蓄器没有直接涉及。

上边是查询PAGEIOLATCH_x的财富等待时间:

select wait_type,
waiting_tasks_count,
wait_time_ms ,
max_wait_time_ms,
signal_wait_time_ms
from sys.dm_os_wait_stats
where wait_type like 'PAGEIOLATCH%' 
order by wait_type

上边是询问出来的等待音讯:

PageIOLatch_SH
总等待时间是(7166603.0-15891)/1000.0/60.0=119.17分钟,平均耗费时间是(7166603.0-15891)/297813.0=24.01皮秒,最大等待时间是3159秒。

PageIOLatch_EX 总等待时间是(3002776.0-5727)/1000.0/60.0=49.95分钟,   
平均耗费时间是(3002776.0-5727)/317143.0=9.45纳秒,最大等待时间是1911秒。

home88一必发 4

关于I/O磁盘 sys.dm_io_virtual_file_stats 函数也做个参谋

SELECT  
       MAX(io_stall_read_ms) AS read_ms,
         MAX(num_of_reads) AS read_count,
       MAX(io_stall_read_ms) / MAX(num_of_reads) AS 'Avg Read ms',
         MAX(io_stall_write_ms) AS write_ms,
        MAX(num_of_writes) AS write_count,
         MAX(io_stall_write_ms) /  MAX(num_of_writes) AS 'Avg Write ms'
FROM    sys.dm_io_virtual_file_stats(null, null)
WHERE   num_of_reads > 0 AND num_of_writes > 0 

home88一必发 5

  总结:PageIOLatch_EX(写入)跟磁盘的写入速度有关系。PageIOLatch_SH(读取)跟内部存款和储蓄器中的数码缓存有涉及。通过地点的sql计算查询,从等待的时间上看,并不曾明晰的评估磁盘质量的正经,但足以做评估规范数据,依期重新复苏设置,做品质剖判。要规定磁盘的压力,还索要从windows系统品质监视器方面来分析。
关于内部存款和储蓄器原理查看”sql server
内部存款和储蓄器初探“磁盘查看”sql
server I/O硬盘人机联作” 。

二.sql server  首要磁盘读写的一坐一起

  2.1 
从数据文件(.mdf)里, 读入新数据页到内部存储器。前页陈说内部存款和储蓄器时我们领略,如若想要的数量不在内部存储器中时,就能从硬盘的数据文件里以页面为最小单位,读取到内部存储器中,还包蕴预读的数码。
当内部存款和储蓄器中存在,就不会去磁盘读取数据。丰硕的内部存款和储蓄器能够最小化磁盘I/O,因为磁盘的快慢远慢于内部存储器。

  2.2  预写日志系统(WAL),向日志文件(.ldf)写入增加和删除改的日记记录。
用来保证数据业务的ACID。

  2.3  Checkpoint 检查点产生时,将脏页数据写入到数据文件
,在sp_configure的recovery interval 调控着sql
server多长期实行一回Checkpoint,
假使常常做Checkpoint,那每趟产生的硬盘写就不会太多,对硬盘冲击不会太大。假设隔长日子叁遍Checkpoint,不做Checkpoint时质量大概会相当的慢,但储存了大量的修改,或许要产生多量的写,那时候质量会受影响。在大部据气象下,暗中认可设置是相比较好的,没需求去改善。

  2.4   内部存款和储蓄器不足时,Lazy
Write产生,会将缓冲区中校正过的多少页面同步到硬盘的数据文件中。由于内部存款和储蓄器的空间不足触发了Lazy
Write, 主动将内部存款和储蓄器中十分久未有接收过的数据页和进行陈设清空。Lazy
Write日常不被平时调用。

  2.5   CheckDB, 
索引维护,全文索引,计算消息,备份数据,高可用一块日志等。

 

三. 磁盘读写的有关分析

  3.1 sys.dm_io_virtual_file_stats  获取数据文件和日志文件的I/O
总计信息。该函数从sql server
二〇〇九始发,替换动态管理视图fn_virtualfilestats函数。
哪些文件常常要做读num_of_reads,哪些平日要做写num_of_writes,哪些读写平时要等待io_stall_*。为了获取有含义的多少,要求在短期内对那么些数据进行快照,然后将它们同基线数据相相比。

SELECT  DB_NAME(database_id) AS 'Database Name',
        file_id,
        io_stall_read_ms / num_of_reads AS 'Avg Read Transfer/ms',
        io_stall_write_ms / num_of_writes AS 'Avg Write Transfer/ms'
FROM    sys.dm_io_virtual_file_stats(null, null)
WHERE   num_of_reads > 0 AND num_of_writes > 0 

  io_stall_read_ms:顾客等待文件,发出读取所用的总时间(阿秒)。

  io_stall_write: 顾客等待在该文件中做到写入所用的总时间阿秒。

  home88一必发 6

  3.2  windows 品质流量计:  Avg. Disk Sec/Read
那一个计数器是指每秒从磁盘读取数据的平均值

< 10 ms – 非常好
 10 ~ 20 ms 之间- 还可以
 20 ~50 ms 之间- 慢,需求关心
> 50 ms –严重的 I/O 瓶颈

  3.4  I/O  物理内存读取次数最多的前50条

 SELECT TOP 50
 qs.total_physical_reads,qs.execution_count,
 qs.total_physical_reads/qs.execution_count AS [avg I/O],
 qs. creation_time,
 qs.max_elapsed_time,
 qs.min_elapsed_time,
 SUBSTRING(qt.text,qs.statement_start_offset/2,
 (CASE WHEN qs.statement_end_offset=-1
 THEN LEN(CONVERT(NVARCHAR(max),qt.text))*2
 ELSE qs.statement_end_offset END -qs.statement_start_offset)/2) AS query_text,
 qt.dbid,dbname=DB_NAME(qt.dbid),
 qt.objectid,
 qs.sql_handle,
 qs.plan_handle
 from sys.dm_exec_query_stats qs
 CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
 ORDER BY qs.total_physical_reads DESC

 3.5 使用sp_spaceused查看表的磁盘空间

  exec sp_spaceused 'table_xx'

home88一必发 7

reserved:保留的上空总数
data:数据选择的半空中总数
index_size:索引使用空间
Unused: 未用的空间量

 3.6  监测I/0运维景况 STATISTICS IO ON;

在写那篇东西的时候作者亦非很驾驭质量基线,到底要检查点什么,dmv要不要反省,perfmon要检查实验那先。

 四  磁盘读写瓶颈的病症

  4.1  errorlog里告知错误 833

  4.2  sys.dm_os_wait_stats 视图里有恢宏等待状态PAGEIOLATCH_* 或
WriteLog。当数码在缓冲区里未有找到,连接的等待状态正是PAGEIOLACTH_EX(写)
PAGEIOLATCH_SH(读),然后发起异步操作,将页面读入缓冲区中。像
waiting_tasks_count和wait_time_ms相比较高的时候,平常要等待I/O,除在体今后数据文件上以外,还或然有writelog的日记文件上。想要获得有含义数据,必要做基线数据,查看感兴趣的流年间距。

select wait_type,
waiting_tasks_count,
wait_time_ms ,
max_wait_time_ms,
signal_wait_time_ms
from sys.dm_os_wait_stats
where wait_type like 'PAGEIOLATCH%' 
order by wait_type

  wait_type:等待类型
  waiting_tasks_count:该等待类型的等候数
  wait_time_ms:该等待类型的总等待时间(富含三个进程悬挂状态(Suspend)和可运市场价格况(Runnable)耗费的总时间)
  max_wait_time_ms:该等待类型的最长等待时间
  signal_wait_time_ms:正在等待的线程从选取功率信号通告到其领头运维之间的时差(一个进度可运市场价格况Runnable费用的总时间)
  i/o等待时间==wait_time_ms – signal_wait_time_ms

为此作者说了算,对作者发的《sql server 品质调优》小说内的 perfmon和dmv做叁个总括。来确立和睦的习性基线。

   五  优化磁盘I/O

   5.1
数据文件里页面碎片收拾。 当表产生增加和删除改操作时索引都会发生碎片(索引叶级的页拆分卡塔 尔(阿拉伯语:قطر‎,碎片是指索引上的页不再具有大要三番五次性时,就能够发出碎片。举个例子您询问10条数据,碎片少时,或然只扫描2个页,但零星多时大概要扫描越来越多页(前面讲索引时在前述)。

   5.2
表格上的目录。比方:建议每个表都包罗集中索引,那是因为数量存储分为堆和B-Tree,
按B-Tree空间占用率越来越高。 充足行使索引收缩对I/0的须要。

   5.3
数据文件,日志文件,TempDB文件指出存放差异物理磁盘,日志文件放写入速度非常快的磁盘上,例如RAID 10的分区

        5.4
文件空间管理,设置数据库增进时要按一定大小拉长,而不能够按百分比,那样幸免一遍提升太多或太少所推动的不供给麻烦。提出对一点都不大的数据库设置二次升高50MB到100MB。下图呈现假若按5%来加强近10G, 纵然有两个应用程序在品味插入风流罗曼蒂克行,但是尚未空间可用。那么数据库恐怕会开首巩固三个近10G,
文件的滋长恐怕会耗用太长的日子,甚至于客户端程序插入查询战败。

  home88一必发 8

       5.5 幸免自动裁减文件,假若设置了此成效,sql
server会每隔三十分钟检查文件的接受,假若空闲空间>20%,会活动运行dbcc
shrinkfile 动作。自动降低线程的会话ID
SPID总是6(今后大概有变) 如下呈现自动减少为False。

   
 home88一必发 9

     home88一必发 10

   5.6 假设数据库的苏醒情势是:完整。
就需求按时做日志备份,防止日志文件Infiniti的拉长,用于磁盘空间。

    

     

io

在io中我们要当心怎么着质量目的呢?

  1. physical
    diskdisk reads/sec   –这几个相应很了然后生可畏看就就掌握 这些目的是指什么的

  2. physical disk disk writes/sec

风流罗曼蒂克张开随笔就见到那2个值,而却有阀值,看见阀值非常快乐,因为不用您去搜聚值了。

• Less than 10 ms = good performance

• Between 10 ms and 20 ms = slow performance

• Between 20 ms and 50 ms = poor performance

• Greater than 50 ms = significant performance
problem.

接下去就是 sys.dm_os_wait_stats
中的多少个wait type

3.
 PAGEIOLATCH_* 

 PAGEIOLATCH_* 系列的wait type 一共有

PAGEIOLATCH_DT   — 破坏,什么是破坏,正是把内部存储器中数据页释放掉
PAGEIOLATCH_EX   — x锁,能够怎么知道,就是排他占用这一个锁

PAGEIOLATCH_home88一必发 ,KP   — 保持,正是保证这么些页不被损坏
PAGEIOLATCH_NL   — 未有定义,保留
PAGEIOLATCH_SH   — 在读,数据页的时候就分配这么些闩

PAGEIOLATCH_UP   — 在修正的时候分配那一个            

依靠onlinebook的解释:在职分等待 I/O 央求中缓冲区的闩锁时发生。闩锁诉求处于“XX”情势。长日子的等候恐怕提示磁盘子系统现身难点。

讲的直接一点正是系统在io,入读或写的时候分配的。等待io央求

4.
ASYNC_IO_COMPLETION

依照onlinebook的解说:当某任务正在守候 I/O 完结时现身

其一是伺机异步io完毕,那么和上边有未有关系啊?答案是从未,下面等待的是io读收取来,可能写入。那几个是等待系统的异步io实现是不一样等的定义。

5.
IO_COMPLETION

依附onlinebook的讲解:在等待 I/O 操作完毕时现身。平常,该等待类型表示非数据页 I/O。数据页 I/O 完结等待显示为 PAGEIOLATCH_* waits。

本条就不表达了说的很领悟了纵然等待非数据页的io落成

6.
WRITELOG

依据onlinebook的讲授:等待日志刷新实现时现身。招致日志刷新的宽广操作是检查点和作业提交。

其风姿洒脱也十分的少解释,就是写入日志时候等待的年华。

cpu

7.Processor/
%Privileged Time                          –内核品级的cpu使用率

8.Processor/ %User
Time                                   –顾客数倍的cpu使用率

9.Process
(sqlservr.exe)/ %Processor Time    –有个别进度的cpu使用率

10.SQLServer:SQL
Statistics/Auto-Param Attempts/sec  
 –试图运转活动参数化次数

11. SQLServer:SQL Statistics/Failed Auto-params/sec       — 自动参数化战败

12. SQLServer:SQL Statistics/Batch Requests/sec      
      — 批管理量

13. SQLServer:SQL Statistics/SQL Compilations/sec    
     — 编写翻译次数

14.  SQLServer:SQL Statistics/SQL Re-Compilations/sec  
 — 反编译次数

15.  SQLServer:Plan Cache/Cache hit Ratio              
             — 实行安插,cache命中率

接下去仍然 wait event的

16.signal_wait_time_ms –从发出信号到最初运转的大运差,时间费用在等候运维队列中,是只是的cpu等待。

上边代码量化的疑似signal_wait_time_ms占的百分比

SELECT SUM(signal_wait_time_ms) AS TotalSignalWaitTime ,

( SUM(CAST(signal_wait_time_ms AS NUMERIC(20, 2)))

/ SUM(CAST(wait_time_ms AS NUMERIC(20, 2))) * 100 )

AS PercentageSignalWaitsOfTotalTime

FROM sys.dm_os_wait_stats

在创造baseline 的时候 完全可以 按那个sql来博取值。

17.SOS_SCHEDULER_YIELD等待

onlinebook的分解:在职责自愿为要实践的别的职分生成布署程序时现身。在该等待时期职务正在等待其量程更新。

全盘看不懂,啥叫量程。

直白的说便是:当查问自动舍弃cpu,而且等待回复施行,这些等待就称为SOS_SCHEDULER_YIELD。

18.CXPACKET等待

onlinebook:当尝试联机查询计算机交流迭代器时现身。要是针对该等待类型的争用成为难点时,能够思忖减弱并行度。

直白点正是:微处理机之间的大器晚成种协作,平日出未来并发查询,为何?因为独有现身查询才用四个Computer。

接下去是 sys.dm_os_schedulers 

SELECT scheduler_id ,

current_tasks_count ,

runnable_tasks_count

FROM sys.dm_os_schedulers

WHERE scheduler_id < 255

19.首固然查每个微处理器上的天职位数量和可运行的义务数。

 

内存

20.SQL Server :Buffer Manager

又比较多立见成效的流速计都以那 buffer manager 对象上边,能够扶持发掘buffer pool滚筒的主题材料。

21.buffer cache hit ratio

buffer cache hit ratio通常景观下在oltp中要超过95%,在olap中要超越十分之九。可惜的是未曾有关那天质量指标相关的表明,和这么些值是怎么着影响预读机制的。假设那么些目标的值有高大的下落那么就声明有标题。这些不可能证实内部存款和储蓄器压力和sql server 健康指数。

22.page life expectancy

page life expectancy是页生命周期,也等于二个数码页在内存中的时间。在那前sql
server 二零零四 4g的内部存款和储蓄器已经异常的大了,sql server buffer
pool的分寸是1.6g,借使sql
server 从磁盘上读取1.6g的数目也只要5分钟,但是明天64g的内存是主流,纵然从磁盘一下子读取50g的内部存款和储蓄器,会严重的撞击io。当存在多量的查询扫描表,读入新的数据页,引致生命周期值下落亦不是不平常的。这么些值必需长时间的监视来深入分析难点。

23.Free Pages

free pages是内部存款和储蓄器中空页的数量,不要临近于0。那一个值表明查询是或不是在别的查询不是放内部存款和储蓄器的处境下,急忙的分配内部存款和储蓄器的最重要根据。若是free pages
超级少,页生命周期非常的短,并且伴随着空页争用(free
list stalls/sec卡塔尔的境况那么很有一点都不小希望产生内部存储器压力。

24.Free list stalls/sec

Free list stalls/sec每秒空页等待的数额,若是风姿罗曼蒂克段时间内都在0以上那么申明恐怕存在内部存储器压力。

25.lazy write/sec

lazy write/sec 正是每秒写入磁盘的次数。倘诺产生量十分的大还要生命周期极短,free page 超级少,不过 free list stall/sec 量十分的大,那么就是产生内存压力了。

SQL Server:memory Manager

SQL Server:memory
Manager对象内对内部存款和储蓄器的花销和内部存款和储蓄器管理的难点提供了很关键参照他事他说加以考察

26.total server
memory 和 target server memory

那2个计数器代表了现阶段sql server 使用的共计内部存储器和sql server 想要用的内部存款和储蓄器。假设 target server memory超越了total server memory,也是内部存款和储蓄器压力的机要标识。sql
server
会收缩内部存储器的供给来就像服务的可用内部存款和储蓄器,只怕通过最大服务器内存配置,所以当内部存款和储蓄器现身压力难点的时候不该第一时间去查看那2个计数器

28.memory grants outstanding

该值是现实性多少进度风流倜傥度打响的拿走了内存的授权。在大器晚成段时间内,业务高峰期,如若该值过低,那么标记或者存在内部存款和储蓄器压力,非常是 memory grants pending 也相比高的情形下。

29. memory grants pending

该值是有过少进度正在等待内部存储器的授权。若是为非0,那么证明须求调动也许优化负载或然扩展内部存款和储蓄器。

 

结束语

各种须求追踪的东西小编都简短的分解了须臾间。关于 wait event
是一同计数的,在总括的时候要求相减。

这么追踪个一天,设置好频率,就可以搜查缴获品质基线了,能够做成Logo,那样经过图片就更易于看到难题了。

 

相关文章