zookeeper server I/O

一. 概述

 sql server作为关系型数据库,需求开始展览数据存款和储蓄,
那在运作中就会没完没了的与硬盘实行读写交互。假使读写不可能正确急忙的成就,就会产出质量难点以及数据库损坏难点。上边讲讲引起I/O的产生,以及分析优化。

Zookeeper的I/O模式?

Zookeeper在起步进程中有一步很重要:初始化ServerCnxnFactory
内部的兑现类有NettyServerCnxnFactory和NIOServerCnxnFactory

2.sql server  首要磁盘读写的表现

  贰.一 
从数据文件(.mdf)里, 读入新数据页到内部存款和储蓄器。前页讲述内部存款和储蓄器时大家通晓,借使想要的数目不在内部存款和储蓄器中时,就会从硬盘的数据文件里以页面为最小单位,读取到内部存款和储蓄器中,还包含预读的数额。
当内部存款和储蓄器中设有,就不会去磁盘读取数据。丰盛的内部存款和储蓄器可以最小化磁盘I/O,因为磁盘的速度远慢于内部存款和储蓄器。

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

  二.三  Checkpoint 检查点爆发时,将脏页数据写入到数据文件
,在sp_configure的recovery interval 控制着sql
server多久进行三次Checkpoint,
假诺平时做Checkpoint,那每一回发生的硬盘写就不会太多,对硬盘冲击不会太大。假如隔长日子1回Checkpoint,不做Checkpoint时质量或者会相比快,但积累了大气的修改,恐怕要发出大量的写,那时质量会受影响。在大多数据气象下,私下认可设置是相比较好的,没须要去修改。

  二.四   内部存储器不足时,Lazy
Write产生,会将缓冲区中期维修改过的数据页面同步到硬盘的数据文件中。由于内存的半空中欠缺触发了Lazy
Write, 主动将内部存款和储蓄器中很久未有动用过的数据页和履行布署清空。Lazy
Write一般不被平常调用。

  2.伍   CheckDB, 
索引维护,全文索引,计算新闻,备份数据,高可用一块日志等。

什么样布置?

QuorumPeerConfig#parseProperties中,能够观望,直接设置serverCnxnFactory的classname就行。

3. 磁盘读写的相关分析

  3.1 sys.dm_io_virtual_file_stats  获取数据文件和日志文件的I/O
总结新闻。该函数从sql server
200九起先,替换动态管理视图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: 用户等待在该文件中成功写入所用的总时间纳秒。

  图片 1

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

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

  三.四  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'

图片 2

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

 3.六  监测I/0运市价况 STATISTICS IO ON;

**Nio? **

public void run() {
        while (!ss.socket().isClosed()) {
            try {
                selector.select(1000);
                Set<SelectionKey> selected;
                synchronized (this) {
                    selected = selector.selectedKeys();
                }
                ArrayList<SelectionKey> selectedList = new ArrayList<SelectionKey>(
                        selected);
                Collections.shuffle(selectedList);
                for (SelectionKey k : selectedList) {
                    if ((k.readyOps() & SelectionKey.OP_ACCEPT) != 0) {
                        SocketChannel sc = ((ServerSocketChannel) k
                                .channel()).accept();
                        InetAddress ia = sc.socket().getInetAddress();
                        int cnxncount = getClientCnxnCount(ia);
                        if (maxClientCnxns > 0 && cnxncount >= maxClientCnxns){
                            LOG.warn("Too many connections from " + ia
                                     + " - max is " + maxClientCnxns );
                            sc.close();
                        } else {
                            LOG.info("Accepted socket connection from "
                                     + sc.socket().getRemoteSocketAddress());
                            sc.configureBlocking(false);
                            SelectionKey sk = sc.register(selector,
                                    SelectionKey.OP_READ);
                            NIOServerCnxn cnxn = createConnection(sc, sk);
                            sk.attach(cnxn);
                            addCnxn(cnxn);
                        }
                    } else if ((k.readyOps() & (SelectionKey.OP_READ | SelectionKey.OP_WRITE)) != 0) {
                        NIOServerCnxn c = (NIOServerCnxn) k.attachment();
                        c.doIO(k);
                    } else {
                        if (LOG.isDebugEnabled()) {
                            LOG.debug("Unexpected ops in select "
                                      + k.readyOps());
                        }
                    }
                }
                selected.clear();
            } catch (RuntimeException e) {
                LOG.warn("Ignoring unexpected runtime exception", e);
            } catch (Exception e) {
                LOG.warn("Ignoring exception", e);
            }
        }
        closeAll();
        LOG.info("NIOServerCnxn factory exited run method");
    }

 肆  磁盘读写瓶颈的症状

  4.一  errorlog里告诉错误 83三

  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:该等待类型的总等待时间(包涵3个进度悬挂状态(Suspend)和可运营状态(Runnable)费用的总时间)
  max_wait_time_ms:该等待类型的最长等待时间
  signal_wait_time_ms:正在等候的线程从接收非非确定性信号公告到其发轫运营之间的时差(三个经过可运维景况Runnable开销的总时间)
  i/o等待时间==wait_time_ms – signal_wait_time_ms

   伍  优化磁盘I/O

   5.一数据文件里页面碎片整理。 当表爆发增加和删除改操作时索引都会发生碎片(索引叶级的页拆分),碎片是指索引上的页不再具备大体三番五次性时,就会发出碎片。比如你询问十条数据,碎片少时,大概只扫描3个页,但零星多时或者要扫描越多页(前边讲索引时在详谈)。

   5.二表格上的目录。比如:建议每一个表都包括聚集索引,那是因为数量存储分为堆和B-Tree,
按B-Tree空间占用率更加高。 足够运用索引减少对I/0的供给。

   伍.三数据文件,日志文件,TempDB文件提议存放不一样物理磁盘,日志文件放写入速度比较快的磁盘上,例如
RAID 10的分区

        伍.4文件空间管理,设置数据库增进时要按一定大小增进,而不能够按比例,那样防止2遍进步太多或太少所带来的不须要麻烦。提出对相比小的数据库设置三次升高50MB到拾0MB。下图体现要是按5%来增长近10G, 假使有一个应用程序在品尝插入一行,不过并未有空间可用。那么数据库可能会初阶升高二个近10G,
文件的坚实也许会耗用太长的年月,以至于客户端程序插入查询失利。

  图片 3

       五.伍 制止自动减弱文件,假设设置了此功能,sql
server会每隔半钟头检查文件的选取,要是空闲空间>25%,会自行运转dbcc
shrinkfile 动作。自动减弱线程的会话ID
SPID总是六(以往也许有变) 如下突显自动收缩为False。

   
 图片 4

     图片 5

   5.陆 借使数据库的恢复生机形式是:完整。
就必要定期做日志备份,幸免日志文件Infiniti的压实,用于磁盘空间。

    

     

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图