SAP HANA负载管理

8 篇文章 1 订阅


前言

HANA的中文资料比较少,尝试总结一部分HANA相关的文档,过程中发现SAP的文档真的是废话连篇。。。写文章的大概率是按字数收稿费的,正好提炼一下吧。


本文章内容基于help.sap.com中SAP HANA Administration Guide

6.12 HANA负载管理

参考:SAP Note 2222250 - FAQ SAP HANA Workload Management

SAP HANA系统的负载可以通过有选择的对资源(CPU/线程/内存等)设置限制与优先级进行管理。这些设置可以是全局的,也可以根据用户设置负载级别。

在SAP HANA系统中,根据平台功能分为很多不同的负载类型,从简单或者复杂的SQL语句,到费时的数据加载作业。这些负载类型必须要与处理并发作业的系统资源相适应。为便于分类,我们将产生负载的语句分为OLTP与OLAP。OLTP语句通常是毫秒量级,一般是单线程执行。OLAP语句比较复杂,执行中一般使用多线程,这也将会消耗大量的CPU与内存。

负载管理的目标是通过平衡各类负载的自愿来最大化提升系统响应能力,而不只是提升某一方面。这些优化也可以提升系统的鲁棒性,使语句的响应时间更加稳定。

6.12.1 SAP HANA 上下文负载

SAP HANA上下文负载是一系列共同特征的请求。
可以通过观察请求的来源来确定高负载是否来自特定的应用或者用户。也可以检查SQL语句的类型:是简单语句还是复杂语句?是否根据业务重要性定义了优先级?比如:是否某一部分业务要在高峰期更频繁地访问系统?还可以看看业务关于响应时间和吞吐量的KPI。

下图展示了不同类型的负载,比如ETL(用于从源系统批量加载数据到数据仓库),OLTP,OLAP

负载类型
系统负载主要是指对系统构成压力的资源使用。我们主要关注的是CPU,内存,磁盘I/O和网络。SAP HANA中,磁盘I/O用来落盘日志。比如,在OLTP的场景中,有非常多体量很小的事务,这些将会触发大量的落盘动作。在横向拓展的HANA中,节点之间的网络也需要被优化,比如,语句路由要用来尽可能减小网络开销。

但是,最主要的关注点还是CPU和内存的分配与使用。OLAP与OLTP同时存在的情况,会对资源形成竞争。当一个请求占据支配地位,就会出现队列拥堵,意味着下个请求要等到之前的请求完成后才能处理。这种情况需要改善以最小化对系统的影响。

6.12.1.1 负载管理方式

负载管理可以在多个级别中配置:OS级别,数据库全局以及SQL会话级别。

可以通过如下方式管理负载:

  • HANA之外,在OS层面限定可用的CPU核数
  • 可以设定静态参数来配置语句执行,内存管理以及高峰负载
  • 可以通过负载级别(workload classes)在runtime动态调整

这些管理方式在HANA安装之初已有默认的设置。这些设置已经满足大多数情况下的负载管理。在开始配置负载管理之前,请确认系统已经在其他方面完成调优:SQL语句已优化,分布式部署的表的分布方式已优化,索引已按需定义等等。

如果需要特定的负载管理配置,提纲见下表:
负载管理项
负载级别管理如图:

负载级别管理

6.12.1.2 理解你的负载

管理负载可以看作循环往复的三个过程:分析当前系统表现,了解负载来源,将负载与系统资源相匹配。

没有哪种负载管理配置可以适合于所有场景,你必须了解你的负载。下图展示如何了解以及优化系统对负载的处理:
负载管理过程

  1. 首先观察系统当前CPU和内存使用情况。检查负载类型,是否是复杂的,耗时的语句
  2. 有了总体认知后,将问题细分到比如业务重要性。相比较与那些不那么耗时的标准报表,这些报表在实际上在战略分析的角度上有这么重要吗?这些语句有可以优化的空间吗?
  3. 当你对系统有了更深的理解,可以有很多方式去影响系统处理负载的方式。首先将负载与资源(CPU内存等)相对应,然后决定请求的优先级,比如应用负载级别。

6.12.1.3 分析系统表现

你可以通过系统视图来分析系统是否有效的处理当前负载。本节列出了一些很有用的视图,这些可以用来分析负载并给出建议。更多关于分析,可以参考 SAP HANA Troubleshooting and Performance Analysis
Guide。

使用如下视图来分析SQL语句的表现:

● M_ACTIVE_STATEMENTS
● M_PREPARED_STATEMENTS
● M_EXPENSIVE_STATEMENTS

如果这些视图表明问题来自语句,可以通过显示内存和并发数量进行优化。

考虑到会话参数(存于表M_SESSION_CONTEXT)可能带来的负面影响,请参考:

● SAP Note 2215929 Using Client Info to set Session Variables and Workload Class settings describes how
client applications set session variables for dispatching workload classes.
● The SAP HANA Developer Guide (Setting Session-Specific Client Information).

使用如下视图分析CPU活动:

● M_SERVICE_THREADS
● M_SERVICE_THREAD_SAMPLES
● M_EXPENSIVE_STATEMENTS.CPU_TIME (column)
● M_SERVICE_THREAD_CALLBACKS (stack frame information for service threads)
● M_JOBEXECUTORS (job executor statistics)

这些视图提供对于某一服务的活动线程以及线程锁的详细信息。

6.12.2 控制CPU消耗

如果底层物理硬件是在几个HANA进程中共享的,你可以对某一HANA进程设置CPU逻辑核数。这些设置是粗颗粒度的,并且是在OS和进程级别的。

可以使用affinity配置参数来限制HANA进程的CPU使用。
首先检查CPU信息,然后在daemon.ini中配置affinity设置,将特定进程绑定在CPU逻辑核上。进程必须重启才能生效。这个方式多用于多租户的HANA实例或者是一台服务器中运行多个HANA实例的情况。

小贴士: 除了如上提到的方法,还可以通过配置global.ini中 [execution] max_concurrency 来达到同样的目的。这个更方便,也无需停机时间。

要想做出这个更改,你需要有权限运行Linux命令lscpu并在HANA中有INIFILE ADMIN的权限。

配置步骤

  1. 使用lscpu确认CPU信息,表中举例为2 physical chips(sockets),每个含8物理核,算上超线程,共提供32逻辑线程
    CPU信息
  2. 除了lscpu,还可以使用/sys/devices/system/cpu/中的一系列命令。每个逻辑核都有一个子目录可以获取CPU信息,例如:
cat /sys/devices/system/cpu/present
cat /sys/devices/system/cpu/cpu12/topology/thread_siblings_list

CPU信息
其他相关的Linux命令还有 sched_setaffinity以及numactl。

  1. 可以使用affinity命令去指定运行HANA进程的CPU逻辑核,包括nameserver, indexserver, compileserver, preprocessor, xsengine(每个进程都在daemon.ini中有自己的一部分参数). affinity设置是通过TrexDaemon生效,当它启动其他HANA进程时,同时运行sched_setaffinity. 此设置重启HANA进程时生效,举例如下:

指定CPU逻辑核
4. 可以将affinity应用在各租户数据库中。需要在SYSTEMDB中运行SQL语句

租户应用举例
5. 应用affinity到同一租户的多个indexserver时,在SYSTEMDB中执行SQL语句来配置instace_affinity[port]参数:

多indexserver配置
6. 使用SQL或hdbcons检查设置是否生效:

在租户或SYSTEMDB中执行:

select * from M_NUMA_NODES;

使用hdbcons时需要indexserver进程ID:

hdbcons -p <PID> "jexec info"

6.12.2.1 配置NUMA Location Perference

关于NUMA,参考:2470289 - FAQ: SAP HANA Non-Uniform Memory Access (NUMA)

NUMA全称为Non-Uniform Memory Access. 是一种内存架构。大致思路是这样:每个处理器都分配有一定量的内存,而这些分配出去的内存,依然可以被其他的处理器访问(分布式共享内存)。访问分配给自己的这部分内存(local access)要比访问分配给其他处理的内存(remote access)快上很多。所以,要尽可能合理分配内存页的位置,尽可能多的使用local access。

一个NUMA节点由一定数量的CPU和内存组成。一般情况下所有NUMA节点的资源是平均分配的。

配置NUMA节点:

CREATE COLUMN TABLE T1(A int, B varchar(10)) NUMA NODE (1,3 TO 5)

优先使用节点1,之后使用节点3到5。节点使用偏好记录在NUMA_NODE_PREFERENCE_表中。

取消NUMA偏好:

ALTER TABLE T1 NUMA NODE NULL

默认情况下配置将在下一次加载表时生效,可以使用IMMEDIATE来即刻生效:

ALTER TABLE T1 NUMA NODE (3) IMMEDIATE

NUMA节点可以配置到如下几个级别:

● Table (column store only)
● Table Partition (range partitioning only)
● Column

如果同时设定了多层规则,column优先生效,然后是partition,最后table。

配置NUMA到column:

CREATE COLUMN TABLE T1(A int NUMA NODE (2), B varchar(10))

到partition:

CREATE COLUMN TABLE T1(A int , B varchar(10)) PARTITION BY RANGE(A) (PARTITION
VALUE = 2 NUMA NODE (4))
ALTER TABLE T1 ADD PARTITION (A) VALUE = 3 NUMA NODE (1) IMMEDIATE

或者使用partition ID:

ALTER TABLE T1 ALTER PARTITION 2 NUMA NODE ('3') 

6.12.2.2 HANA CPU监控视图

有很多系统视图可以用来获取CPU配置:

M_HOST_INFORMATION提供主机信息,比如OS配置。数据以键值对的形式存储,每分钟更新数据。大多数数据需要INIFILE ADMIN权限。示例:

select * from SYS.M_HOST_INFORMATION where key in
('cpu_sockets','cpu_cores','cpu_threads');

M_NUMA_RESOURCES提供整体资源可用信息。示例:

select HOST, NUMA_NODE_ID, NUMA_NODE_DISTANCES, MEMORY_SIZE from SYS.M_NUMA_NODES;

M_NUMA_NODES提供每个NUMA节点的资源信息,包括节点间距离以及邻节点信息。示例:

select MAX_NUMA_NODE_COUNT, MAX_LOGICAL_CORE_COUNT from SYS.M_NUMA_RESOURCES;

6.12.3 控制SQL语句的并发执行

可以通过配置ini文件来控制SqlExecutor和JobExecutor这两个线程池来控制语句的并发执行。

过多的语句并发会带来系统性能问题。值得注意的是,对表的partition会在一定程度上提高并发数。

一般情况下,SqlExecutor和JobExecutor线程池的线程数有软性限制,可以随着使用量增加或者减少。

  • SqlExecutor
    此线程池处理客户端请求以及执行简单语句。主要处理OLTP语句(大多数情况下)。
  • JobExecutor
    JobExecutor负责作业分发。几乎所有并行任务会被分发到Job
    Executor以及他对应的JobWorker线程。主要处理OLAP语句,也处理表更新,备份,内存GC,记录savepoint。

可以为这两个线程池设定线程数上限进行控制。比如在OLAP占据过多CPU资源时,设定JobExecutor的最大值来为OLTP负载预留资源。

也可以使用用户参数文件中的“THREADLIMIT”参数来管理负载,后面会提到。

SqlExecutor参数

以下SqlExecutor参数包含在indexserver.ini参数文件中的sql部分:

sql_executors 设定线程池可使用的CPU逻辑核数。缺省值为零(数值设定为逻辑CPU核数)。线程会随系统使用而被创建或删除。减少线程数能帮助减少内存占用。

max_sql_executors 设定线程池可使用的CPU逻辑核数的上限。正常运行中HANA将会创建新的线程来处理请求。如果到达上限,HANA将拒绝新的请求并输出超过限制的错误信息。参数缺省值为零(不设上限)。

JobExecutor参数

JobExecutor参数包含在global.ini和indexserver.ini参数文件中的execution部分。

max_concurrency 设定线程池的CPU逻辑核数。功能与缺省值SqlExecutor中的sql_executors一致。在多租户系统中,需要花更多心思,根据各租户的资源消耗及优先程度设置。

max_concurrency_hint 限制job workers占用的逻辑核数。此参数定义了这个独立事务的最大并发数。如果有多个并发步骤,可能会生成比该参数更多的并发语句。该参数缺省值为零,表示没有限制,但是此值永远不会比max_concurrency大。在一些硬件性能高的机器(4 sockets以上)中,将这个参数设定为1 socket中的逻辑CPU核数可能会提高性能。

default_statement_concurrency_limit 限制单个语句中的并发执行程度。这个参数要设为1到max_concurrency,但是要大于等于max_concurrency_hint. 缺省值为零,没有限制。

6.12.4 配置SQL语句的内存限制

可以通过限制单个语句的内存使用上限防止系统因为个别SQL语句带来性能问题。

前提条件:需要INIFILE ADMIN权限来配置参数。并需要在global.ini中开启enable_tracking和memory_tracking。如果需要单独为某个用户设置规则,则还需要开启resource_tracking。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值