云服务器内容精选

  • 操作场景 服务Operator是OSC管理的最大粒度实体,服务运行载体是一个Operator,当服务对应的服务实例首次安装时,容器集群中如果没有对应的服务Operator,OSC会自动安装。 OSC将在首次部署服务的集群中创建三个新的命名空间osc-global、osc-oc、osc-system,并运行Operator或Helm插件。例如,Redis服务将在osc-global命名空间中部署一个redis-operator插件,这个插件就是Redis服务的管理插件。
  • 安装插件 登录UCS控制台,单击集群名称进入集群,在左侧导航栏中选择“插件中心”。 在“可安装插件”中找到gpu-device-plugin,单击“安装”。 在安装插件页面,填写插件配置。 插件规格:可配置“默认”或“自定义”规格,请根据实际情况选择。 容器:选择“自定义”规格时支持设置。 Nvidia驱动:您可使用CCE提供的驱动地址或手动填写自定义Nvidia驱动的地址,集群下全部GPU节点将使用相同的驱动。 GPU虚拟化功能仅支持470.57.02、470.103.01、470.141.03、510.39.01、510.47.03版本的GPU驱动。 建议您使用CCE提供的驱动地址,以满足驱动版本的要求。 如果下载链接为公网地址,例如地址为nvidia官网地址https://us.download.nvidia.com/tesla/470.103.01/NVIDIA-Linux-x86_64-470.103.01.run,则各GPU节点均需要绑定EIP。获取驱动链接方法请参考获取驱动链接-公网地址。 若下载链接为OBS上的链接,无需绑定EIP 。获取驱动链接方法请参考获取驱动链接-OBS地址。 请确保Nvidia驱动版本与GPU节点适配。 更改驱动版本后,需要重启节点才能生效。 对于linux 5.x内核系统,如Huawei Cloud EulerOS 2.0或ubuntu 22.04,建议使用470及以上版本驱动。 图1 更新kubeconfig文件 驱动选择:若您不希望集群中的所有GPU节点使用相同的驱动,CCE支持以节点池为单位安装不同的GPU驱动。 插件将根据节点池指定的驱动版本进行安装,仅对节点池新建节点生效。 新建节点更新驱动版本后,需重启节点生效。非新建节点不支持更新驱动版本。 插件卸载会自动删除已安装的GPU驱动。 GPU虚拟化:选择开启GPU虚拟化,支持GPU单卡的算力、显存分割与隔离。 若集群中未安装volcano插件,将不支持开启GPU虚拟化,您可单击“一键安装”进行安装。如需配置volcano插件参数,请单击“自定义安装”,详情请参见volcano。 若集群中已安装volcano插件,但插件版本不支持使用GPU虚拟化,您可单击“一键升级”进行升级。如需配置volcano插件参数,请单击“自定义升级”,详情请参见volcano。 单击“安装”,安装gpu-device-plugin插件的任务即可提交成功。
  • 获取驱动链接-公网地址 登录CCE控制台。 创建节点,在节点规格处选择要创建的GPU节点,选中后下方显示的信息中可以看到节点的GPU显卡型号。 图2 查看显卡型号 登录到nvidia网站。 如图3所示,在“NVIDIA驱动程序下载”框内选择对应的驱动信息。其中“操作系统”必须选Linux 64-bit。 图3 参数选择 驱动信息确认完毕,单击“搜索”按钮,会跳转到驱动信息展示页面,该页面会显示驱动的版本信息如图4,单击“下载”到下载页面。 图4 驱动信息 获取驱动软件链接方式分两种: 方式一:如图5,在浏览器的链接中找到url=/tesla/470.103.01/NVIDIA-Linux-x86_64-470.103.01.run的路径,补齐全路径为https://us.download.nvidia.com/tesla/470.103.01/NVIDIA-Linux-x86_64-470.103.01.run,该方式节点需要绑定EIP 。 方式二:如图5,单击“下载”按钮下载驱动,然后上传到OBS,获取软件的链接,该方式节点不需要绑定EIP。 图5 获取链接
  • 安装nvidia-fabricmanager服务 A100/A800 GPU支持 NvLink & NvSwitch,若您使用多GPU卡的机型,需额外安装与驱动版本对应的nvidia-fabricmanager服务使GPU卡间能够互联,否则可能无法正常使用GPU实例。 本文以驱动版本470.103.01为例,您可参考以下步骤进行安装,请根据实际情况需要替换驱动版本。 登录需要安装nvidia-fabricmanager服务的GPU节点,该节点需绑定EIP用以下载nvidia-fabricmanager服务。 安装与驱动版本对应的nvidia-fabricmanager服务,您可通过官方下载操作系统和驱动版本对应的安装包。 CentOS操作系统 以CentOS 7为例: driver_version=470.103.01 wget https://developer.download.nvidia.cn/compute/cuda/repos/rhel7/x86_64/cuda-drivers-fabricmanager-${driver_version}-1.x86_64.rpm rpm -ivh nvidia-fabric-manager-${driver_version}-1.x86_64.rpm Ubuntu等其他操作系统 以Ubuntu 18.04为例: driver_version=470.103.01 driver_version_main=$(echo $driver_version | awk -F '.' '{print $1}') wget https://developer.download.nvidia.cn/compute/cuda/repos/ubuntu1804/x86_64/nvidia-fabricmanager-${driver_version_main}_${driver_version}-1_amd64.deb dpkg -i nvidia-fabricmanager-${driver_version_main}_${driver_version}-1_amd64.deb 启动nvidia-fabricmanager服务。 systemctl enable nvidia-fabricmanager systemctl start nvidia-fabricmanager 查看nvidia-fabricmanager服务状态。 systemctl status nvidia-fabricmanager
  • 约束与限制 下载的驱动必须是后缀为“.run”的文件。 仅支持Nvidia Tesla驱动,不支持GRID驱动。 安装或重装插件时,需要保证驱动下载链接正确且可正常访问,插件对链接有效性不做额外校验。 gpu-device-plugin插件仅提供驱动的下载及安装脚本执行功能,插件的状态仅代表插件本身功能正常,与驱动是否安装成功无关。 如您使用A100/A800的多GPU卡机型,您需要手动安装与版本驱动对应的nvidia-fabricmanager服务才可以正常使用,详情请参见安装nvidia-fabricmanager服务。
  • 插件说明 postgis 创建postgis插件时,会同步创建以下插件: postgis postgis_topology fuzzystrmatch postgis_tiger_geocoder address_standardizer address_standardizer_data_us 创建的postgis插件版本如果大于等于3.0.0,创建postgis插件时会同步创建postgis_raster插件。 创建postgis_topology和postgis_tiger_geocoder插件,会更改search_path。search_path对已经建立的连接不会更新,如果需要使用这两个插件功能,需要重新建立连接更新search_path设置。 plpgsql plpgsql 1.0插件支持提供SQL过程语言,默认内置安装,无需手动创建该插件。 earthdistance 安装earthdistance插件前,请先安装cube插件。 cube 如果已安装earthdistance插件,删除cube插件会导致earthdistance插件不可用。 timescaledb RDS for PostgreSQL的timescaledb插件不支持tsl协议的特性,具体请参见timescaledb插件不支持的部分接口。 wal2json 该插件是逻辑复制插件,您可以直接使用该插件,不需要通过control_extension安装。 该插件不能通过pg_available_extensions查询,查看是否支持wal2json插件可通过如下语句确认,执行不报错说明支持wal2json插件。 select pg_create_logical_replication_slot('tst_wal2json', 'wal2json'); 该条语句执行成功后,需要删除slot,否则会导致wal日志积压。 select pg_drop_replication_slot('tst_wal2json'); pg_profile_pro 因发现插件存在缺陷,现暂时关闭支持,我们会在缺陷修复后重新开放,给您造成不便敬请谅解。
  • timescaledb插件不支持的部分接口 add_compress_chunks_policy add_drop_chunks_policy add_reorder_policy alter_job_schedule compress_chunk decompress_chunk drop_chunks interpolate locf move_chunk remove_compress_chunks_policy remove_drop_chunks_policy remove_reorder_policy reorder_chunk set_integer_now_func time_bucket_gapfill
  • 请求示例 更新数据库db1的插件pg_stat_statements。 PUT https://{endpoint}/v3/0483b6b16e954cb88930a360d2c4e663/instances/dsfae23fsfdsae3435in03/extensions { "database_name" : "db1", "extension_name" : "pg_stat_statements" }
  • 约束与限制 2020年7月1日之前购买的RabbitMQ实例,不支持在控制台开启插件,如果需要开启,请在控制台提工单,技术人员在后台开启插件。 2020年11月14日之前购买的RabbitMQ实例,不支持在控制台开启rabbitmq_consistent_hash_exchange插件,如果需要开启,请在控制台提工单,技术人员在后台开启插件。 开启插件过程中,不会重启实例。 rabbitmq_shovel和rabbitmq_federation插件在特定场景下才支持开启,具体如表2所示。 表2 支持开启插件的场景 实例 rabbitmq_shovel rabbitmq_federation 未开启SSL的单机实例 支持 支持 已开启SSL的单机实例 不支持 不支持 未开启SSL的集群实例 不支持 支持 已开启SSL的集群实例 不支持 不支持
  • 注意事项 plpgsql为内置插件,不允许卸载。 decoderbufs, wal2json等逻辑复制插件可以直接使用,不需要安装。 部分插件依赖“shared_preload_libraries”参数,只有在加载相关库之后,才能安装成功。 pg_cron插件当前仅支持PostgreSQL 12(12.11.0及其以上版本)、PostgreSQL 13及以上版本。使用时需要先修改参数“cron.database_name”为需要使用的数据库(仅支持单个数据库),同时修改“cron.use_background_workers”为“on”。 pltcl插件在PostgreSQL 13.2版本实例暂不支持使用,如需使用该插件,请先升级到最新小版本。 部分插件安装或卸载时,会同步安装或卸载其依赖插件,以及相关依赖表。例如:创建插件postgis_sfcgal时,需要先创建postgis插件,这时会同步创建postgis_sfcgal插件;同时,卸载postgis插件时,会同步卸载postgis_sfcgal插件。 部分插件在小版本升级后不支持直接升级,如需升级请卸载后重新安装。
  • IResultV1接口实现 package main import ( "fmt" "time" ) const ( InnerVarName = "__name" InnerVarGoroutineId = "__goroutine_id" InnerVarExecutorIndex = "__executor_index" InnerVarExecutorCount = "__executor_count" ) type IResultV1 interface { GetName() string GetUrl() string GetMethod() string GetRequestHeader() map[string]string GetRequestBody() string GetSentBytes() int GetResponseCode() int GetResponseHeader() map[string]string GetResponseBody() string GetReceivedBytes() int GetFailureMessage() string IsSuccess() bool GetBeginTime() int64 GetEndTime() int64 GetSubResults() []interface{} } //acquireResult generates root result. //just call one time on the main func and generate sub result using parent.addSub() func acquireResult(name string) *Result { result := &Result{} result.Name = name result.RequestHeader = map[string]string{} result.ResponseHeader = map[string]string{} result.ResponseCode = 200 result.Success = true result.BeginTime = time.Now().UnixMilli() result.EndTime = time.Now().UnixMilli() return result } type Result struct { Name string Url string Method string RequestHeader map[string]string RequestBody string SentBytes int ResponseCode int ResponseHeader map[string]string ResponseBody string ReceivedBytes int FailureMessage string Success bool BeginTime int64 EndTime int64 SubResults []interface{} SubIndex int } func (r *Result) GetName() string { return r.Name } func (r *Result) GetUrl() string { return r.Url } func (r *Result) GetMethod() string { return r.Method } func (r *Result) GetRequestHeader() map[string]string { return r.RequestHeader } func (r *Result) GetRequestBody() string { return r.RequestBody } func (r *Result) GetSentBytes() int { return r.SentBytes } func (r *Result) GetResponseCode() int { return r.ResponseCode } func (r *Result) GetResponseHeader() map[string]string { return r.ResponseHeader } func (r *Result) GetResponseBody() string { return r.ResponseBody } func (r *Result) GetReceivedBytes() int { return r.ReceivedBytes } func (r *Result) GetFailureMessage() string { return r.FailureMessage } func (r *Result) IsSuccess() bool { return r.Success } func (r *Result) GetBeginTime() int64 { return r.BeginTime } func (r *Result) GetEndTime() int64 { return r.EndTime } func (r *Result) GetSubResults() []interface{} { return r.SubResults } //begin records begin time, do not forget call this function to update func (r *Result) begin() { r.BeginTime = time.Now().UnixMilli() } //end records end time, do not forget call this function to update func (r *Result) end() { r.EndTime = time.Now().UnixMilli() } //addSub adds sub result to parent, call this function adding sub result always. //if name is not empty, renaming will be disabled func (r *Result) addSub(name string) *Result { if name == "" { name = fmt.Sprintf("%s-%d", r.Name, r.SubIndex) r.SubIndex++ } else { name = fmt.Sprintf("%s-%s", r.Name, name) } sub := acquireResult(name) r.SubResults = append(r.SubResults, sub) return sub } 表2 IResultV1接口结构说明表 名称 含义 补充说明 Name 请求名称 根result需使用内置参数__name设置。 Url 请求地址 - Method 方法 用于HTTP的POST,GET等。 RequestHeader 请求头 用于HTTP。 RequestBody 请求数据 建议不要记录请求较大的数据,例如上传文件,仅记录摘要即可。 SentBytes 发送字节数 - ResponseCode 响应码 记录响应状态,可以用于HTTP状态码或者自定义状态码,用于报告统计响应状态数量用于分析。 响应码范围:[100,599] ResponseHeader 响应头 用于HTTP。 ResponseBody 响应数据 建议不要记录响应较大的数据,例如下载文件,仅记录摘要即可。 ReceivedBytes 接收字节数 - FailureMessage 失败信息 - Success 是否成功 - BeginTime 请求开始时间 单位:毫秒 EndTime 请求结束时间 单位:毫秒 SubResults 子请求 当自定义请求需要多个子请求共同完成,需要使用该字段记录各个子请求执行情况。 SubIndex 子请求索引 当使用父Result的addSub方法生成子Result时,如果不为子Result自定义名称,将使用该字段自增产生索引用于生成子Result名称。
  • 请求签名 func(map[string]string) interface{} 入参:性能测试服务内置参数以及自定义参数。 出参:interface需实现IResultV1接口,如有必要,请使用性能测试服务提供的IResultV1接口实现。 表1 性能测试服务内置参数 名称 含义 补充说明 __name 请求名称 - __goroutine_id 协程id - __executor_index 执行机索引 序号从0开始。 __executor_count 执行机总数 -
  • 基本使用 pg_stat_statements插件安装好之后,需要开启对应参数。默认参数配置如下,可根据不同业务进行调整。 表1 参数说明 参数名称 是否需要重启 值 允许值 描述 pg_stat_statements.max 是 5000 100~5,000,000 设置pg_stat_statements跟踪的最大语句数。 pg_stat_statements.save 否 on on,off 保存服务器关闭期间的pg_stat_statements统计信息。 pg_stat_statements.track 否 top top,all,none 控制哪个语句可以被该模块计数。 pg_stat_statements.track_planning 否 off on,off 选择是否由pg_stat_statements跟踪计划持续时间。 pg_stat_statements.track_utility 否 on on,off 选择是否由pg_stat_statements跟踪实用程序命令。 此时,可以通过查询pg_stat_statements视图,获取统计信息。 select * from pg_stat_statements; 查询最耗IO的SQL。 --消耗IO的前五条SQL select userid::regrole, dbid, query from pg_stat_statements order by (blk_read_time+blk_write_time) desc limit 5; 查询最耗共享内存的SQL。 select userid::regrole, dbid, query from pg_stat_statements order by (shared_blks_hit+shared_blks_dirtied) desc limit 5; 重置统计信息。 select pg_stat_statements_reset();
  • 进阶使用 使用pg_stat_statements排查CPU过高问题。 为了方便排查CPU过高的问题,需要重置pg_stat_statements的计数器。 select pg_stat_statements_reset(); 等待一段时间,使pg_stat_statements能够统计到足够的信息。 获取最耗时的SQL。 select * from pg_stat_statements order by total_exec_time desc limit 10; 此步骤获取到的SQL会长时间占用用户态CPU时间,把这些SQL取出来分析。 获取读取Buffer次数最多的SQL。 select * from pg_stat_statements order by shared_blks_hit + shared_blks_read desc limit 10; 此步骤获取到的SQL可能由于缺少查询对应的索引,导致过多的buffer读,从而消耗大量CPU。 获取执行次数最多的SQL。 select * from pg_stat_statements order by calls desc limit 10; 有些比较简单的SQL单独执行耗时较低,但是在某些情况下(例如:在事务中循环执行、大量的并发执行)也会导致CPU的消耗增高。
  • 支持的版本说明 PostgreSQL 10及以上版本的最新小版本支持该插件。 可通过以下SQL语句查询当前实例是否支持该插件: SELECT * FROM pg_available_extension_versions WHERE name = 'pg_stat_statements'; 如果不支持,可通过升级内核小版本或者使用转储与还原升级大版本使用该插件。 RDS for PostgreSQL实例支持的插件,具体请参见支持的插件列表。