elasticsearch怎么提高磁盘性能io
性能测试
在一个节点的一个分片,不设置副本,测试性能
在完全默认设置上记录性能数据,作为测试的基准线
确保性能测试持续30分钟以上以确认长时间的性能;短时间的测试可能不会碰到segment合并和GC,无法确认这些因素的影响
每次基于默认基准线更改一个参数,如果性能有提升就保留设置,并基于此设置做后续的测试
bulk使用建议
每个请求大小建议在5-15MB,逐步增大测试,当接收到EsRejectedExecutionException,就说明已经到达节点的瓶颈了,就需要减少并发或者升级硬件增加节点
当写入数据时,确保bulk请求时轮询访问所有节点,不要发送所有请求到一个结点导致这一个节点要在内存存储所有请求的数据去处理
优化磁盘IO
使用SSD
使用RAID 0,不用镜像备份,用replicas保证数据正确性,增大磁盘IO
使用多个磁盘给Elasticsearch访问,通过在pathdata中添加
不使用远程存储,如NFS/SMB/CIFS;延时将成为性能瓶颈
段合并
段合并是很消耗计算资源和磁盘IO的操作,特别是出现比较大的段合并。
当出现段合并的速度落后于索引写入的速度,Elasticsearch为了避免出现堆积的段数量爆发,会降低单个线程的索引写入速度,并且会在INFO的log里记录“now throttling indexing“
Elasticsearch默认比较保守,不想让搜索的性能被后台的段合并影响,默认的段合并速率限制比较低,默认是20MB/s,但如果使用的是SSD,可以考虑把这个参数设置到100-200MB/s
PUT /_cluster/settings
{
"persistent" : {
"indicesstorethrottlemax_bytes_per_sec" : "100mb"
}
}123456123456
如果你只是用bulk导入数据而不关注查询性能,可以关闭合并的阈值
PUT /_cluster/settings
{
"transient" : {
"indicesstorethrottletype" : "none"
}
}123456123456
然后在导入完数据之后恢复成“merge”来恢复这个阈值设置
如果是机械硬盘,你需要增加下面的配置到elasticsearchyml中
indexmergeschedulermax_thread_count: 111
机械硬盘的并发IO性能较差,我们需要减少每个索引并发访问磁盘的线程数,这个设置会有max_thread_count+2个线程并发访问磁盘
如果是SSD可以忽略这个参数,默认线程数是Mathmin(3, RuntimegetRuntime()availableProcessors() / 2),对于SSD来说没有问题。
可以增大indextranslogflush_threshold_size参数,默认是200M,可以增大到如1GB。增大这个参数可以允许translog在flush前存放更大的段(segment);更大的段的创建会减少flush的频率,并且更大的段合并越少,会减少磁盘IO,索引性能更高。
周末线上机器有一小段时间磁盘iowait比较高导致业务方性能告警,周一和周二查了下并着力解决这个问题。发现dell的机器存在raid卡电池relearn过程,导致raid卡的而写入方式会在一小段时间从wirteBack切到writeThrough,待relearn过程完成再切换回来。
WriteBack :进行写操作时,将数据写入RAID卡缓存,并直接返回,RAID卡控制器将在系统负载低或者Cache满了的情况下把数据写入硬盘。该设置会大大提升RAID卡写性能,绝大多数的情况下会降低系统IO负载。 数据的可靠性由RAID卡的BBU(Battery Backup Unit)进行保证。
WriteThrough : 数据写操作不使用缓存,数据直接写入磁盘。RAID卡写性能下降,在大多数情况下该设置会造成系统IO负载上升。
对于LSI的MegaSAS RAID卡, 默认的Cache策略是: WriteBack, ReadAheadNone, Direct, No Write Cache if Bad BBU
查看cache策略
查看当前的BBU Learn设置
强制启动Learn Cycle操作
IBM的服务器默认设置是30天执行一次Learn Cycle, 而DELL是90天。
在查看这个过程中发现dell的ilo时间和时区都不准确。
修改过程如下
参考:
http://blogwyliehobbscom/indexphp/2015/09/23/using-racadm-on-centos-6-rhel-6-for-dell-idrac/
http://jonamikicom/2014/12/22/set-ntp-settings-on-a-dell-server-with-idrac7/
1使用iotop命令
使用该命令有个条件,Linux内核要高于2620的版本,版本过低则没有此命令,执行效果如下图所示:
2:block_dump方法
首先,关闭syslog服务,然后开启block_dump,最后正则表达式提取dmesg信息。
/etc/initd/syslog stop
echo 1 > /proc/sys/vm/block_dump
dmesg | egrep "READ|WRITE|dirtied" | egrep -o '([a-zA-Z])' | sort | uniq -c | sort -rn | head
执行结果如下图所示:
注意:操作完成后请关闭block_dump和启动syslog
echo 0 > /proc/sys/vm/block_dump #关闭block_dump
/etc/initd/syslog start #启动syslog
一,硬盘IO的延时
对于SQL Server数据库系统,限制查询响应的主要因素是硬盘的延时,根据硬盘的物理构造(磁道和扇区),延时可以分为寻道延时和旋转延时:
寻道延时:硬盘的物理刺头移动并定位到所需数据的时间,
旋转延时:硬盘旋转到所需数据的时间,通常用MB/S,或IO吞吐量来衡量
在OLTP系统中,数据更新操作较多,每次读取的数据量少,目标数据的位置相对随机(随机读写),因此,对于寻道延时要求更高,硬盘需要花费更多的寻道时间。
在DSS/DW系统中,事务的运行时间更长,数据相对静态,不常更新,读操作比写操作的要求更高,顺序读操作占比很高,因此,IO吞吐量更重要,可以通过硬盘的盘面来增加顺序访问的IO吞吐量。
二,根据WaitType侦测IO性能
SQL Server引擎把IO作为一个资源来看待,在多任务的现代数据库系统中,同一时刻会接收到很多查询请求,每一个查询请求都需要申请系统资源(CPU、内存和IO),才能继续执行下去,然而系统的资源是有限的,当查询争用资源时,有些查询请求资源得到满足,顺利执行下去,有些查询请求的资源得不到满足,该查询就被阻塞,处于等待资源分配的状态。当出现IO性能问题时,查询语句会被硬盘IO阻塞,这使得执行计划被迫挂起(或阻塞)来等待资源,SQL Server通过DMV来显示系统运行的状态,用等待类型来表示不同的阻塞信息。
1,数据文件的IO
如果SQL Server 出现 IO 性能问题,那么在SQL Server 内部通过DMV sysdm_exec_requests的wait_type,来反馈 IO 问题。如果查询请求的wait_type长时间处于PageIOLatch_XX,那么说明系统不能很快把数据读取到内存中。
PAGEIOLATCH_xx :用于描述数据页的IO争用,说明系统正在从硬盘加载数据到内存的Buffer Pool中
当SQL Server 要去读或写一个Page的时候,首先会在Buffer Pool里寻找,如果在Buffer Pool中找到了,那么读写操作会继续进行,没有任何等待。如果没有找到,那么SQL Server 就会设置Wait_Type为PageIOLatch_EX(写)或PageIOLatch_SH(读),然后发起一个异步IO操作,将页面读入Buffer Pool中,在IO没有完成之前,Request将会保持在PageIOLatch_EX(写)或PageIOLatch_SH(读)的等待状态。IO消耗的时间越长,等待的时间越长。
2,日志文件的写入
日志文件以写为主,工作量由修改命令激发的事务数量决定。当SQL Server要写事务到日志文件时,如果Disk 不能及时完成IO请求,那么事务就无法提交,SQL Server 不得不进入WriteLog 等待状态,直到事务被成功记录到日志文件中,才会提交当前的事务。
如果request经常出现WriteLog的Wait type,说明事务日志的写请求不能被Disk及时完成,这种情况,对SQL Server 整体性能影响较大。
WRITELOG:在数据被修改时,在Log Cache和Buffer Cache中都会有记录,如果在Log Cache中的数据在checkpoint时写入硬盘,就会发生这种等待。
LOGBUFFER等待:很少出现,当一个任务正在等待存储日志到Log Buffer中时,就会出现LOGBUFFER等待,出现这种等待,说明日志所在的硬盘无法响应请求。如果把日志文件放在一个非常慢的硬盘上,而数据文件放在一个非常快的硬盘上,就会出现这种等待。
3,AYSNC_IO_COMPLIETION和IO_COMPLIETION也是IO瓶颈的潜在指标
AYSNC_IO_COMPLIETION:标识任务正在等待IO请求来完成操作,当一个应用程序连接SQL Server,在处理数据时变得非常慢,很可能就会出现这种类型的等待。
IO_COMPLIETION:发生在一个任务正在等待用于非数据页IO的IO操作上,非数据页,一般是指日志文件,通常发生在修改大量修改,或者内存中存在大量的脏数据时。
三,影响读写性能的因素
数据库系统对IO的性能依赖较高,那么影响数据库系统读写性能的因素有哪些呢?
1,物理硬盘的IO能力
机械硬盘的IO速度没有固态硬盘快,可以考虑把数据库系统的机械硬盘更新为固态硬盘。
2,内存对硬盘IO的影响
在SQL Server Engine 访问数据时,如果相应的data不存在于Buffer Pool,那么Buffer Manager 从Disk中的Data File(mdf 或 ndf)中将相应的data page读取到内存中。SQL Server 将data page缓存起来。理想情况下,只要SQL Server能够使用的内存充足,SQL Server 会将所有读取到内存的中Data Page缓存到Buffer Pool中。对于读取操作,只要相应的数据都缓存在内存中,Select 就不会有任何硬盘IO。
当Buffer Pool空间不足时,SQL Server 激活 LazyWriter,主动将内存中一些很久没有使用的Data Cache和 Plan Cache 清除,mark为Free buffer,供其它Data Page使用。如果这些Page上的修改还没有被CheckPoint写回Disk,那么LazyWrite会将其写回。
3,碎片和压缩
如果数据页面或index 页面的碎片很多,每个页面存储的数据行较少,那么SQL Server 需要读写更多的Page。如果数据在页面里存储的非常紧凑,存储相同数据所消耗的Page越少,并且可以充分利用SQL Server 预读的优势,减少IO。
压缩技术不仅使数据占用的Disk 空间减少,而且能够减少IO。由于数据在写入Disk之间经过压缩处理,存储相同数据所消耗的Page减少,读取的Data Page会减少。压缩技术在一定程度上能够降低IO,但需要付出一定的代价:额外消耗少量的CPU和内存来解压缩。
4,利用多个物理硬盘实现Data File的并发读写
在DB中的FileGroup 创建多个File,将这些File存放到不同的Physical Disk上。File 分布到不同的Physical Disk上,IO也会分布到不同的Physical Disk上,这样能够实现数据的并发读取,提高读取性能。
对于日志文件,SQL Server会频繁的写事务日志。只要数据库发生修改,就会不断地写入日志文件。如果不能及时完成日志文件的IO,会导致事务的延迟提交,对性能的影响较大,所以,尽量将日志文件放到写入速度快的Disk上。SQL Server 顺序写事务日志,在一个时间点,SQL Server 只会写一个日志文件。在不同的Physical Disk上创建多个log file对性能基本没有帮助。
5,工作负载
日志文件以写为主,工作量由修改命令申请的事务数量决定,日志文件是顺序写的,写入速度快于随机写。如果日志记录不能及时写入,那么Request会处于WriteLog等待状态,对系统整体性能影响较大。
数据文件写入的数据量由修改量决定,SQL Server除了设置bulk logged 恢复模式之外,没有太大的调整选项。
数据文件读取的数据量,由访问的数据量和Buffer Pool中缓存的数据量共同决定。如果访问的数据量减少或者内存缓存区增加,都可以降低SQL Server 从Physical Disk读取的Data Page数量。在内存不变的情况下,可以通过优化查询语句,减少数据访问量,来提高SQL Server 数据文件的读取性能。
考虑通过将原有的du命令替换,并基于df命令来编写一个新的du命令来取而代之。
[root@idc1-server2 ~]# mv /usr/bin/du /usr/bin/duorig
[root@idc1-server2 ~]# vim /usr/bin/du
1 #!/bin/sh
2
3 mydf=$(df -Pk $2 | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $3 }')
4 echo -e "$mydf\t$2"
[root@idc1-server2 ~]# chmod +x /usr/bin/du
不过这样的话,统计出来的结果不就不准确了吗?
但具体情况具体应对,一般来说,Hadoop的datanode都会采用不同的磁盘并划分分区来存储数据,那么使用df统计出来的结果,误差应该是很小的。
0条评论