1、关闭交换分区
处理大规模数据通常需要较大的内存。关闭交换分区可以确保系统更多地使用物理内存,提高内存利用率,从而改善查询性能和系统响应速度。
避免交换开销:当系统的物理内存不足时,操作系统会将一部分内存数据写入交换分区,以释放物理内存供其他进程使用。
这个过程涉及磁盘IO操作,会导致延迟增加,对OLAP 等需要低延迟数据访问的系统来说是不利的。
通过关闭交换分区,可以避免这种交换开销,提高数据访问的实时性和性能。
配置修改:
sudo vim /etc/sysctl.conf
vm.swappiness = 0
sudo sysctl -p
2、配置内存超额分配
设置操作系统允许内存超额分配,从而确保在Doris需要更多内存时,可以快速的获取内存资源。
配置修改:
sudo vim /etc/sysctl.conf
vm.overcommit_memory = 1
sudo sysctl -p
3、禁用透明大页
透明大页 (Transparent Huge Pages, THP) 是 Linux 系统中用于提高内存管理效率的一种机制。
它会自动将常规大小的内存页(通常是4KB)组合成大页(通常是2MB或更大),以减少页表的大小并提高内存访问的效率。
在使用Doris时,透明大页可能会引起性能问题,特别是在内存分配和回收方面。
因为大页的回收比常规页的回收更耗时,所以在内存紧张的情况下,使用大页可能会导致更高的延迟。
建议关闭透明大页,以避免上述的性能问题和内存浪费。
配置修改:
1:临时生效
echo madvise > /sys/kernel/mm/transparent_hugepage/enabled
2: 永久生效(需要重启机器)
vim /etc/default/grub
#在GRUB_CMDLINE_LINUX字段所在一行,在末尾添加 transparent_hugepage=madvise
GRUB_CMDLINE_LINUX=“crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet transparent_hugepage=madvise”
4、文件最大打开数
在 Linux 系统中,每个进程都有一个最大打开文件数的限制,也就是它可以同时打开的文件和 Socket 的数量。这个限制可以防止程序因为错误而耗尽系统资源。
对于数据库系统,需要提高这个限制。如果达到了最大打开文件数的限制,应用程序可能会因无法打开新的文件或Socket而失败。
在linux系统中,限制了同一会话最大打开文件数量(ulimit -n)与用户能够启动的最大进程数(ulimit -u),这个限制可以防止程序因为错误耗尽系统资源。
配置修改:
1:通过ulimit -n 655360与ulimit -a命令设置当前缓存生效
2:修改limits.conf 文件设置下一次重启生效
sudo vim /etc/security/limits.conf
- soft nofile 655360
- hard nofile 655360
sysctl -p
5、FE内存配置
FE实际内存占用取决于多个因素,包括但不限于以下内容:
前端元数据的大小:FE需要存储和管理数据库的表结构、分区信息、索引等元数据,这些数据的大小会影响FE的内存占用。
并发连接数:FE需要为每个连接维护一些上下文信息,包括查询状态、会话信息等。并发连接数增加会增加FE的内存占用。
查询复杂性和数据量:复杂的查询和大规模数据操作需要更多的内存来存储中间结果和处理数据。
其他系统资源的占用:FE需要一些额外的内存来处理缓存、缓冲区和其他系统资源。
FE进程实际占用内存大小大于jvm设置的一半时,checkpoint 可能会频繁触发fullgc引起不必要的集群稳定问题。
建议:
修改JVM大小到FE进程实际占用内存大小的两倍以上。
6、配置一致性检查
查看集群的各节点参数配置是否一致,避免节点配置修改有遗漏。
7、mq-deadline调度算法
mq-deadline是一种多队列I/O调度算法,它能对I/O请求进行排序和合并,以提高硬盘读写的效率。
由于SATA磁盘的性能限制,使用mq-deadline能有效优化其数据读写速度,因此这个算法特别适合SATA磁盘。
配置修改:
1:如果系统支持的是多队列I/O调度算法
/sys/block/sda/queue/scheduler文件的值中出现mq-deadline、kyber、none
echo mq-deadline > /sys/block/sda/queue/scheduler
2:如果系统支持的是单队列I/O调度算法
/sys/block/sda/queue/scheduler文件的值中出现deadline、noop、cfq
echo deadline > /sys/block/sda/queue/scheduler
8、kyber调度算法
kyber是一种多队列I/O调度算法,它针对低延迟设备(如NVMe/SSD)进行了优化,以提高数据读写性能。
如果系统不支持kyber调度算法,使用none调度算法则能避免不必要的I/O操作重新排序,从而最大限度地利用硬件的性能。
配置修改:
1:如果系统支持的是多队列I/O调度算法
/sys/block/sda/queue/scheduler文件的值中出现mq-deadline、kyber、none
#如果系统支持 kyber 调度算法
echo kyber > /sys/block/sda/queue/scheduler
#如果您的系统不支持 kyber 调度算法
echo none > /sys/block/sda/queue/scheduler
2:如果系统支持的是单队列I/O调度算法
/sys/block/sda/queue/scheduler文件的值中出现 deadline、noop、cfq
echo noop > /sys/block/sda/queue/scheduler
9、TCP连接队列
TCP连接队列是服务器用来处理入站TCP连接请求的地方。
在一些情况下,例如在服务器负载过高时,这个队列可能会被填满,无法再接受新的连接请求。
在默认的配置下,新的连接请求会被阻塞,直到有空闲的空间在队列中开放。这可能导致新的合法请求不能得到及时处理,影响用户体验。
当net.ipv4.tcp_abort_on_overflow设置为1时,如果TCP连接队列满了,那么新的连接请求将被立即丢弃,而不是被阻塞。
这有助于服务器更快地恢复到正常的运行状态,因为它不需要等待队列中的旧的连接请求被处理完。这也能降低因为大量等待连接而导致的系统资源过度使用。
配置修改:
sudo vim /etc/sysctl.conf
net.ipv4.tcp_abort_on_overflow = 1
sudo sysctl -p
10、系统级别全连接队列最大长度
数据库系统通常需要处理大量并发连接。如果全连接队列的长度过小,可能会导致新的连接请求被拒绝,影响数据库的访问性能。
设置系统级别全连接队列最大长度为1024,可以帮助数据库系统处理更多的并发连接,提高其响应能力和吞吐量,从而提高整体的数据库性能。
配置修改:
sudo vim /etc/sysctl.conf
net.core.somaxconn = 1024
sudo sysctl -p
11、关闭recovery模式
查看集群是否处于recovery模式,当集群遇到故障时需要进行recovery
在fe的conf文件中查看metadata_failure_recovery参数
值为true则开启恢复模式,false则默认关闭,平常不建议开启
12、集群平衡查看
查看集群集平衡状态是否正常,影响集群磁盘的使用率
在 mysql client 执行 ADMIN SHOW FRONTEND CONFIG like ‘%balance%’;命令查看集群平衡情况
disable_balance和disable_tablet_scheduler值都为false的话,均衡正常开启
13、FE的profile关闭
查看FE上的Report是否打开,是否能在fe web界面直观查看执行的Report信息
在 mysql 客户端通过 show variables like '%profile%'命令查看
值为true显示开启,为false则关闭,建议不要开启profile
14、tablet bad查看
查看某张表对应的tablet bad的数量,是否影响表的读写
在mysql client通过命令SHOW PROC ‘/cluster_health/tablet_health’;
查看当前doris集群tablet状态,用TabletNum数量减去HealthyNum就是bad tablet的数量
15、Pipeline开启
查看doris的新Pipeline执行引擎是否开启,影响集群cpu高效利用
在mysql客户端,执行show variables like ‘%pipeline%’;
查看experimental_enable_pipeline_engine对应值,值为true则开启,为false则关闭,默认开启
16、CPU频率调整策略
CPU频率调整策略(Scaling Governor)用于管理CPU的运行频率,以实现对系统性能和能耗的平衡控制。
Scaling Governor 包含了一些模式,如“on-demand”,“powersave”,“performance”等。
默认的 “on-demand” 模式在系统负载增加时会提高CPU频率,而在系统空闲时会降低频率,以此达到节能效果。
但由于频率调整过程会带来一定的延迟,这可能对一些对延迟敏感的任务(如数据库查询等)产生影响。
使用"performance"模式,CPU将始终以最高频率运行,选择"performance"模式可以减小因频率调整带来的延迟,提升数据库的响应速度和处理能力。
配置修改:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
如果没有这个文件,就说明不支持scaling governor,可以跳过。
在Linux中,内核的开发者定义了一套框架模型来完成CPU频率动态调整这一目的,它就是CPU Freq系统。
如下为CPU的几种模式(governor参数):
ondemand:系统默认的超频模式,按需调节,内核提供的功能,不是很强大,但有效实现了动态频率调节,平时以低速方式运行,当系统负载提高时候自动提高频率。
以这种模式运行不会因为降频造成性能降低,同时也能节约电能和降低温度。一般官方内核默认的方式都是ondemand。
interactive:交互模式,直接上最高频率,然后看CPU负荷慢慢降低,比较耗电。Interactive 是以 CPU 排程数量而调整频率,从而实现省电。
InteractiveX 是以 CPU 负载来调整 CPU 频率,不会过度把频率调低。所以比 Interactive 反应好些,但是省电的效果一般。
conservative: 保守模式,类似于ondemand,但调整相对较缓,想省电就用他吧。Google官方内核,kang内核默认模式。
smartass:聪明模式,是I和C模式的升级,该模式在比interactive 模式不差的响应的前提下会做到了更加省电。
performance:性能模式!只有最高频率,从来不考虑消耗的电量,性能没得说,但是耗电量。
powersave:省电模式,通常以最低频率运行。
userspace:用户自定义模式,系统将变频策略的决策权交给了用户态应用程序,并提供了相应的接口供用户态应用程序调节CPU运行频率使用。
也就是长期以来都在用的那个模式。可以通过手动编辑配置文件进行配置
Hotplug:类似于ondemand, 但是cpu会在关屏下尝试关掉一个cpu,并且带有deep sleep,比较省电。
修改工作模式:
echo performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
17、非一致内存访问NUMA检查
如果物理内存是分布式的,由多个cell组成(比如每个核有自己的本地内存),那么CPU在访问靠近它的本地内存的时候就比较快,
访问其他CPU的内存或者全局内存的时候就比较慢,这种体系结构被称为Non-Uniform Memory Access(NUMA)。
在多核系统中,如果物理内存对所有CPU来说没有区别,每个CPU访问内存的方式也一样,则这种体系结构被称为Uniform Memory Access(UMA)。
BE机器绑定多个NUMA节点可能会影响BE性能。
在BE所在机器执行lscpu
NUMA node0 CPU(s): 0-12,52-64
NUMA node1 CPU(s): 13-25,65-77
NUMA node2 CPU(s): 26-38,78-90
NUMA node3 CPU(s): 39-51,91-103
NUMA的取舍与优化设置
在os层numa关闭时,打开bios层的numa会影响性能,QPS会下降15-30%;
在bios层面numa关闭时,无论os层面的numa是否打开,都不会影响性能。
安装numactl:
#yum install numactl -y
#numastat 等同于cat /sys/devices/system/node/node0/numastat ,在/sys/devices/system/node/文件夹中记录系统中的所有内存节点的相关详细信息。
#numactl --hardware 列举系统上的NUMA节点
#numactl --show 查看绑定信息
Redhat或者Centos系统中可以通过命令判断bios层是否开启numa
#grep -i numa /var/log/dmesg
如果输出结果为: No NUMA configuration found
说明numa为disable,如果不是上面内容说明numa为enable,例如显示:NUMA: Using 30 for the hash shift.
可以通过lscpu命令查看机器的NUMA拓扑结构。
关闭numa:
1、编辑/etc/default/grub
2、在 GRUB_CMDLINE_LINUX里添加 numa=off
3、输入命令 grub2-mkconfig -o /boot/grub2/grub.cfg 用更改的文件重新生成 /boot/grub2/grub.cfg,重启生效
4、查看结果:cat /proc/cmdline dmesg |grep -i numa