补充优化
优化五:进程与CPU绑定
大数据环境经常是多个组件混合部署的,特别是当负载较高的时候,就会遇到资源竞争,导致资源利用率低下,以及由于计算机底层的结构设计,以及操作系统的抽象,对一些组件来说,资源的利用效率不是最高的,因此有必要对一些混合部署的大数据组件进行硬件资源的隔离,进一步说是将进程与具体的CPU以及内存进行绑定,也就是充分使用numa架构的特性,提升处理效率,降低组件之间的干扰。而在linux中,内置了Cgroup对资源进行隔离。
NUMA(Non-Uniform Memory Access):非均匀内存访问架构
是指多处理器系统中,内存的访问时间是依赖于处理器和内存之间的相对位置的。这种设计里存在和处理器相对近的内存,通常被称作本地内存;还有和处理器相对远的内存, 通常被称为非本地内存。
一个NUMA Node内部是由一个物理CPU和它所有的本地内存(Local Memory) 组成的。广义得讲, 一个NUMA Node内部还包含本地IO资源,对大多数Intel x86 NUMA平台来说,主要是PCIe总线资源。ACPI规范就是这么抽象一个NUMA Node的。
安装工具:
yum install libcgroup libcgroup-tools numactl -y
总体资源分布情况
资源分配:
5.1kafka--大约需要3~4core
1、创建kafka资源组
cgcreate -g cpuset: kafka
2、创建kafka的资源策略
cgset -r cpuset.cpus=32-36 kafka
cgset -r cpuset.mems=0 kafka
3、使用kafka的资源组
在kafka-server-start.sh脚本中修改
5.2、flink
1、创建flink资源组
cgcreate -g cpuset: flink
2、创建flink的资源策略
cgset -r cpuset.cpus=16-31,48-63 flink
cgset -r cpuset.mems=1 flink
3、使用flink资源组
vim taskmanager.sh
flink自带的脚本中有:
4、备注
在查看flink的standalone模式下的 taskmanager.sh下已经有numa相关的一些配置,查看资料进行了以下尝试。
standalone环境下,可以通过flink.yaml中设置taskmanager.compute.numa: true启用numa特性,将会分别在对应的numa节点分别创建一个taskmanager,从而高效地利用cpu。
5.3、clickhouse
1、创建资源组
cgcreate -g cpuset: clickhouse
2、分配资源
cgset -r cpuset.cpus=32-47 clickhouse
cgset -r cpuset.mems=1 clickhouse
3、应用
1、启动clickhouse
2、获取clickhouse进程id
cat /run/clickhouse-server/clickhouse-server.pid
3、将进程id写入
echo 64792 >> /sys/fs/cgroup/cpuset/clickhouse/cgroup.procs
初步结论
1、开启cpu与进程绑定时,flink任务重启后,对kafka的吞吐量影响较小,有待于进一步测试
2、Cgroup可以在进程运行时,手动设置进程运行在哪些Cpu核心上,不需要重启进程
3、使用Cgroup已有两种方式
1、在进程启动时指定资源组,通常对java代码有效
cgexec -g cpuset:clickhouse xxx.sh(启动脚本,)
2、进程启动后,将pid加入资源组的cgroup.procs,通常对C++可执行程序有效
echo 64792 >> /sys/fs/cgroup/cpuset/clickhouse/cgroup.procs
实时任务的优化
(1)独占资源和共享资源的策略
在一台机器中,共享资源池可以被多个实时任务抢占,如果一个任务在运行时80%以上的时间都需要去抢资源,这时候就需要考虑给它分配更多的独占资源,避免抢不到CPU资源导致吞吐量急剧下降。
(2)合理选择缓存机制,尽量降低读写库次数
内存读写性能是最好的,根据业务的特性选择不同的缓存机制,让最热和最可能使用的数据留在内存中,读写库次数降低后,存吐量自然就上升了.(LRU)
(3)计算单元合并,降低拓扑层级
拓扑结构层级越深,性能越差,因为数据在每个节点间传输时,大部分是需要经过序列化和反序列化的,而这个过程非常消耗CPU和时间(相当于减少跨excutor执行任务)
(4)内存对象共享,避免字符拷贝
在海量数据处理中,大部分对象都是以字符串形式存在的,在不同线程间合理共享对象,可以大幅降低字符拷贝带来的性能消耗,不过要注意不合理使用带来的内存溢出问题。(类似mapjoin)
(5)在高吞吐量和低延时间取平衡
高吞吐量和低延时这两个特性是一对矛盾体,当把多个读写库操作或者ACK操作合并成一个时,可以大幅降低因为网络请求带来的消耗,不过也会导致延时高一些,在业务上衡量进行取舍。