hadoop distcp 参数调优_linux性能调优总结 - 星火撩原
系统性能一直是个热门话题。做运维这几年也一直在搞性能调优,写这个文章也算是对工作的总结。
讲调优第一步是,要讲为什么要调优?也就是系统分析,分析还需要有指标,做好性能监控的情况下,看到确实需要调优才能进行。不能为了调优而 “调优“ 那不是调优,那是破坏。
性能分析的目的
找出系统性能瓶颈
为以后的优化提供方案或者参考
达到良好利用资源的目的。硬件资源和软件配置。
影响性能的因素
想确定有哪些因素,首先确定你的应用是什么类型的?
例如:
- cpu密集型
例如web服务器像nginx node.js需要CPU进行批处理和数学计算都属于此类型 - io密集型
例如数据库常见的mysql,大量消耗内存和存储系统,对CPU和网络要求不高,这种应用使用CPU来发起IO请求,然后进入sleep状态。
确定了应用类型就开始分析有哪些情况能影响性能:
大量的网页请求会填满运行队列、大量的上下文切换,中断
大量的磁盘些请求
网卡大量的吞吐
以及内存耗尽等。
归结起来就是4个方面
系统检测的工具
我们知道了这四大块影响着我们的性能,那我们有什么工具进行检测呢?
在工作中常用到的有:
htop vmstat iotop sar strace iftop ss lsof ethtool mtr等另外推荐阿里的tsar以及glances进行系统性能监控。
CPU 性能监控以及调优
我们可以 通过检查cpu使用量,通过工具观测上下文切换、中断以及代码调用等方面来进行优化。
首先明确几个术语:
缓存:为了提供内存i/o性能cpu提供硬件级缓存。查看缓存可以用过 lscpu -p命令来查看
[root@master ~]# lscpu
L1d 缓存: 32K
L1i 缓存: 32K
L2 缓存: 256K
L3 缓存: 3072K
1级缓存为静态缓存,分为数据缓存和指令缓存。
2级和3级缓存为动态缓存,其中2级缓存为共享缓存。
为了提高cpu缓存命中率我们通常的做法是把cpu绑定在某一个核上,也就是”cpu亲和性”
linux下我们可以通过”taskset”命令来实现
[root@master ~]# taskset -pc 06552
pid 6552's current affinity list: 0
pid 6552's new affinity list: 0
但是这样还是有问题。例如不能保证本地内存分配,所以这时候我们需要使用numa来解决问题
NUMA:非一致性内存访问机制。每个屋里核心都有一段自己使用的内存成为本地节点,都有自己的内存控制器,距离最近的内存节点成称为邻均节点。
上图为numa的简单的拓扑,来源于互联网。
numactl可以将程序绑定到特定的numa节点
# numactl --show #查看当前的numa配置
policy: default
preferred node: current
physcpubind: 0
cpubind: 0
nodebind: 0
membind: 0
注:数据库服务器不要用numa,如果要使用请在数据库启动请使用numactl —interleave=all。作为运维可能都被坑过。
cpu调度策略
- 实时调度策略
- SCHED_FIFO 静态调度策略,一旦占用cpu则一直运行,一直运行直到有更高优先级任务到达或自己放弃。
- SCHED_RR 时间轮询策略,当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。
实时调度策略作用值为1-99,数字越大优先级越高。
- 一般策略
- SCHED_OTHER 默认调度策略通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。作用值为100-139,数字越小优先级越高。
- SCHED_BATCH
- SCHED_IDLE
chrt 修改实时优先级,生产中一般不要修改,默认是rr调度
SCHED_OTHER 使用nice、renice修改。
另外other支持动态调整,如果手动直接nice修改即可。
context switches:上下文切换
linux内核将每一个core当作一个独立的处理器。一个内核可以同时运行50~50000个进程。每个线程将会分配一个时间片,直到这个线程的时间片用完,或是被更高优先级的线程抢占,它才会被重新放回cpu队列。切换线程的过程就是context switch。context switch越高,则内核调度的工作负担越大。
vmstat 既可以看到 cs的高低
run queue 运行队列
每个cpu都有一个运行队列。线程,要么在sleep状态(阻塞并等待IO),要么在运行状态。运行队列越长,则等待cpu处理这个线程的时间越长。运行队列是全局的会被所有CPU共享
load就是用来描述运行队列的。它的值等于当前正在处理的线程+运行队列里面的线程。
比如当前系统核数是2,有两个线程正在执行行,还有4个线程在运行队列里面,那么它的load=2+4。
vmstat w uptime 都可以观测运行队列负载情况。
cpu性能监控
说了这么多,那正常情况下需要观察哪些值呢?
首先numa 以及算法都是特殊情况下优化的,一般情况下不会去动这些,需要根据你的业务场景来进行绑定调整,像虚拟化,云计算等可能就需要进行调整。
那么我们日常需要观测的性能点是:
- cpu利用率
- us 60%-70%
- sy 30%-35%
- id 0%-5%
- cs上下文切换
- cs和cpu利用率相关,如果能保持上面所说的利用率大量的切换可以接受
- 运行队列
例子:
# vmstat 15
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------r b swpd free buff cache si so bi bo in cs us sy id wa st30115084027162826068455309840021002247300501150840270264260684553103200005873608513137300501150840263940260684553104000046721750715137200401150840263320260684553106800006111711710137600401150840262328260684553107200006854767318136800
例子中cpu中断(in)以及上下文切换(cs)都比较高,说明内核不得不来回切换进程,同时in也是比较高说明cpu一直在请求资源。
内存memory
术语
MMU:
CPU是不能与硬盘打交道的,只有数据被载入到内存中才可以被CPU调用。cpu在访问内存的时候需要先像内存监控程序请求,由监控程序控制和分配内存的读写请求,这个监控程序叫做MMU(内存管理单元)
线性地址到物理地址的映射,如果按照1个字节1个字节映射的话,需要一张非常大的表,这种转换关系会非常的复杂。因此把内存空间又划分成了另外一种存储单元格式,通常为4K。
每个进程如果需要访问内存的时候都需要去查找page table的话需要借助缓冲器TLB,但每次产找tlb没有或者大量查找还是会造成缓慢,所以又有了page table的分级目录。page table可以分为1级目录,2级目录和偏移量。
另外让系统管理大量内存有两种方法:
- 增加硬件内存管理单元中页表数
增大页面大小
第一种方法不太现实,所有我们考虑第二种方法。即:大页面。
32位系统4m大页框64位系统2m大页框,页框越粗浪费越严重。
查看系统的大页面:AnonHugePages: 309248 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 6144 kB
DirectMap2M: 1042432 kB
DirectMap1G: 0 kB
AnonHugePages:透明大页面,THP是一个提取层,可自动创建、管理和使用超大页面的大多数方面。
另外HP必须在引导时设置。
手动设置大页面的页数:
sysctl vm.nr_hugepages = 20
DMA:直接读取内存
在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。
虚拟内存:
32位的系统上每一个进程在访问内存的时候,每一个进程都当做自己有4个G的内存空间可用,这叫虚拟内存(地址),虚拟内存转化成物理内存是通过MMU来完成的。生产中我们尽量不使用虚拟内存。
影响系统性能的几个内存参数:
- overcommit_memory 过量使用内存
- 0 默认设置系统决定是否过量使用。
- 1 不过量使用
- 2 过量使用但有一定的比例默认百分值五十由overcommit_ratio决定(他就是默认的50),举个例子物理内存8g,swap4g,可以过量使用10g。
注:生产中尽量避免过量使用,例如redis要关闭过量使用。
- spappines
-将不活跃的进程换进swap。注:尽量不去使用swap。
生产中设置:
echp 10 > /proc/sys/vm/swappines - 回收内存
- 这个值设定为 1、2 或者 3 让内核放弃各种页缓存和 slab 缓存的各种组合。
1 系统无效并释放所有页缓冲内存即buffers
2 系统释放所有未使用的 slab 缓冲内存。即cached
3 系统释放所有页缓冲和 slab 缓冲内存。
生产中使用:
1.运行sync
- echo 3>/proc/sys/vm/drop_caches
- 这个值设定为 1、2 或者 3 让内核放弃各种页缓存和 slab 缓存的各种组合。
i/o
IO子系统一般是linux系统中最慢的部分。一个原因是它距离CPU的距离,另一个原因是它的物理结构。因此尽量要减少磁盘IO。
磁盘调度策略:
[root@master ~]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
其中当前使用cfq策略。
cfq:完全公平调度。在其时间片段中,进程每次最多可有八个请求(默
认)。调度程序会尝试根据历史数据估计某个程序是否会在近期发出更多 I/O,然后 CFQ 会闲置,等待那个
I/O,即使有其他进程正在等待发出 I/O
deadline:每一个请求在指定的期限前必须得到服务。
noop:没有策略
anticipatory:已被抛弃,写多读少的场景使用。
linux内核以page为单位访问磁盘IO,一般为4K。
查看page: /usr/bin/time -v date
MPF
linux会将内存物理地址空间映射到虚拟内存,内核仅会映射需要的内存页。当应用启动时,内核依次搜索CPU cache和物理内存,查找是否有相应的内存页,如果不存在,则内核将会发起一次MPF(major page fault),将磁盘中的数据读出并缓存到内存中。
如果在buffer cache找到了对应的内存页,则将会产生一个MnPF(minor page fault).
/usr/bin/time -v helloworld
第一次执行会发现大部分是MPF
第二次执行会发现大部分是MnPF
The File Buffer Cache
file buffer cache用来减少MPF,增加MnPF,它将会持续增长,直到可用内存比较少或是内核需要为其它应用来释放一些内存。free内存比较少,并不能说明系统内存紧张,只能说明linux系统充分使用内存来做cache.
[root@master ~]# cat /proc/meminfo
MemTotal: 995896 kB
MemFree: 715976 kB
MemAvailable: 719832 kB
Buffers: 3140 kB
将数据页写回磁盘
可以使用fsync()或是sync()立即写回,如果没有直接调用这些函数,pdflush会定期刷回磁盘。
iotop可以显示所有进程的IO占用情况
lsof可以查看所有的调用并打开的文件
其他命令:
vmstat sar iostat top htop等
hadoop distcp 参数调优_linux性能调优总结 - 星火撩原相关推荐
- 文件上传服务器jvm调优,JVM性能调优解决方案(12页)-原创力文档
精品文档 JVM性能调优解决方案(总结) 一.引言 本文的读者是技术支持人员.阅读本文后,你将理解 jboss 的启动脚本文件 (run.sh )中有一系列的 JVM配置参数的含义,以及如何调整它们, ...
- hbase 读写调优_hbase性能调优
一.服务端调优 1.参数配置 1).hbase.regionserver.handler.count:该设置决定了处理RPC的线程数量,默认值是10,通常可以调大,比如:150,当请求内容很大(上MB ...
- java g1 收集调优_Java性能调优:充分利用垃圾收集器
java g1 收集调优 JVM背后发生了什么,垃圾回收如何影响Java性能? 性能调优世界是一个危险的地方,一个JVM标志失衡,事情很快就会变得繁琐. 因此 ,我们决定求助于Java性能调优专家, ...
- java 性能调优_Java性能调优调查结果(第四部分)
java 性能调优 这是本系列中的最后一篇文章,我们将分析我们在2014年10月进行的Java Performance Tuning Survey的结果.如果您尚未阅读第一篇文章,建议您首先阅读以下内 ...
- java 性能调优_Java性能调优调查结果(第三部分)
java 性能调优 这是本系列文章的第三篇,我们将分析2014年10月进行的调查的结果.如果您尚未这样做,我建议从本系列的前两篇文章开始: 问题严重性分析和监视域分析 . 这篇文章着重于故障排除/根本 ...
- java 性能调优_Java性能调优调查结果(第二部分)
java 性能调优 这是系列文章的第二篇,我们将分析2014年10月进行的性能调整调查的结果.如果您尚未阅读第一部分,我们建议从此处开始 . 第二部分将重点监视Java应用程序的性能问题. 特别是,我 ...
- java 性能调优_Java性能调优调查结果(第一部分)
java 性能调优 我们在2014年10月进行了Java性能调优调查.该调查的主要目的是收集对Java性能世界的见解,以改善Plumbr产品. 但是,我们也很高兴与您分享有趣的结果. 我们收集的数据为 ...
- Day820.抢购活动性能瓶颈调优 -Java 性能调优实战
抢购活动性能瓶颈调优 Hi,我是阿昌,今天学习记录的是关于抢购活动性能瓶颈调优. 每年的双十一都是很多研发部门最头痛的节日,由于这个节日比较特殊,公司一般都会准备大量的抢购活动,相应的瞬时高并发请求对 ...
- mysql调优explain_MySql性能调优利器之Explain
Mysql Explain 详解 一.语法 explain < table_name > 例如: explain select * from t3 where id=3952602; 二. ...
最新文章
- 【kindeditor】KindEditor获取多个textarea文本框的值并判断非空
- golang strings包部分函数使用
- Shell脚本:向磁盘中批量写入数据
- 2017\National _C_C++_C\1.哥德巴赫分解
- 使用 Node.js Express 的最佳实践
- 一个使用Java BlockingQueue实现的生产者和消费者
- MySQL 下载与安装
- 437. 路径总和 III
- php实现ftp上传,PHP_PHP实现ftp上传文件示例,FTP上传是PHP实现的一个常见且 - phpStudy...
- 安卓逆向系列教程 4.13 MagSearch 1.8 爆破
- Incorrect username or password (access token)
- 传智播客 C/C++学习笔记 数组和指针的关系, 字符串学习
- flash cs4 调整渐变工具
- 伟创ac80b变频器故障代码_安川变频器故障代码和安川变频器报警详解
- Linux软件安装方法之rpm包安装
- Go语言圣经 - 前言
- 使用kmean进行图像分割 使用CRFs进行分割后处理
- Codewars笔记
- 【android】Android Studio创建模拟手机虚拟机
- 大型客户关系管理系统源码CRM
热门文章
- 求美国EO-1卫星的ALI载荷和Hyperion载荷的光谱响应函数
- Mybatis中按照年、季度、月、日、最近七天,查询
- 计算机绘图专业,计算机绘图与设计专业
- Apache Tomcat安全漏洞列表及整改建议合集
- 1.7.10我的世界java下载_我的世界1.7.10
- LVM中VG PV PP LV的概念
- Anemometer让慢查询可视化
- 计算机上应用锁,电脑怎么设置软件锁
- 深度丨一文读懂智能制造的主线——智能生产(工厂/车间数字化)
- [2017集训队作业自选题#149]小c的岛屿