云服务器内容精选

  • NetworkManager 选型介绍 NetworkManger作为network的替代品,功能更强大,在新版os中基本都是以NetworkManager作为主流。综合来说,network服务更适合那些熟悉命令行和手动配置的用户,而NetworkManager则更适合普通用户或需要自动管理网络连接的情况。在大多数Linux发行版中,NetworkManager已成为默认的网络管理工具。 NetworkManager和network不可同时使用。
  • 安装毕昇编译器 确认repo源配置正常。 请检查默认的/etc/yum.repos.d/hce.repo配置文件中参数是否正确,正确的配置如下。 [base] name=HCE $releasever base baseurl=https://repo.huaweicloud.com/hce/$releasever/os/$basearch/ enabled=1 gpgcheck=1 gpgkey=https://repo.huaweicloud.com/hce/$releasever/os/RPM-GPG-KEY-HCE-2 [updates] name=HCE $releasever updates baseurl=https://repo.huaweicloud.com/hce/$releasever/updates/$basearch/ ...... 执行yum -y install bisheng-compiler命令安装工具。 执行source /usr/local/bisheng-compiler/env.sh命令,导入环境变量。 如果打开了新的终端,需要在新的终端重新导入环境变量才能正常使用毕昇编译器。 检查工具是否安装成功。 执行clang -v查看工具的版本号。若返回结果包含毕昇编译器版本信息,表示工具安装成功。
  • mitigations 2018年01月,谷歌Project Zero公布现代处理器存在安全漏洞Spectre与Meltdown,这两组漏洞几乎涉及当今大部分主流处理器(包括Intel、AMD、ARM等多种架构)。随后,包括Linux在内的主流操作系统都对漏洞进行了相应的软件修复,mitigations即是控制这些CPU漏洞修复是否开启的开关。 由于漏洞利用处理器硬件的推测执行(Speculative Execution)以及乱序执行(Out-of-order Execution)特性,而这些特性对于现代处理器的性能提升具有不可或缺的作用。因此开启CPU漏洞修复会有一定的性能下降,在某些极端场景下性能下降甚至超过50%,并且软件修复的方法只能缓解不能根治漏洞问题,因此建议默认关闭mitigations功能,可以通过在系统启动参数中添加mitigations=off并重启系统从而关闭该功能。
  • nohz 在Linux内核2.6.17版本之前,Linux内核为每个CPU设置一个周期性的时钟中断,Linux内核利用这个中断处理一些定时任务,如线程调度等。这样导致就算CPU不需要定时器的时候,也会有很多时钟中断,导致资源的浪费。Linux内核2.6.17版本引入了nohz机制,实际就是让时钟中断的时间可编程,在CPU空闲的情况下减少不必要的时钟中断。 nohz功能对CPU的能耗有积极的作用,但对负载均衡而言却不友好,在部分业务场景下开启nohz会导致性能下降,因此建议默认关闭nohz功能,可以通过在系统启动参数中添加nohz=off并重启系统从而关闭该功能。 nohz功能在部分特殊场景下对性能有积极作用,例如多个线程同时并发读取/proc/cpuinfo的场景。
  • 碎片整理 由于大页分配需要连续的物理内存区域,长时间运行的系统往往因频繁分配和释放导致内存碎片化。碎片整理(defragmentation)是指内核通过页面迁移等手段合并零散的物理页,从而形成足够大的连续区域用于大页分配。碎片整理可能会导致系统延迟上升,特别是在前台执行时。 配置路径: /sys/kernel/mm/transparent_hugepage/defrag 参数选项说明: always:当前线程始终等待内核整理碎片后再分配大页,可能严重影响响应时间。 defer:当前线程不会等待,碎片整理在后台异步执行。 madvise:仅针对显式调用madvise()请求的内存区域进行整理。 defer+madvise:当前线程不等待,碎片整理交给后台,仅针对明确请求使用大页的内存。 never:完全不整理碎片,若无法直接分配大页,则回退为小页。
  • 后台合并线程 khugepaged是内核中的后台线程,定期扫描匿名内存区域,将合适的4KB页自动合并为2MB的大页。 相关配置文件目录如下, /sys/kernel/mm/transparent_hugepage/khugepaged/ 关键配置文件: defrag:功能开关,可选的配置项如下: 1:允许khugepaged主动整理内存碎片。 0:关闭khugepaged主动整理内存碎片功能。 alloc_sleep_millisecs:重试间隔(单位:毫秒),当分配大页失败时,khugepaged下一次尝试分配前的等待时间,默认值为60000。 pages_to_scan:扫描页数,khugepaged每次唤醒后扫描的页数,默认值为4096。 scan_sleep_millisecs:扫描间隔(单位:毫秒),用于调节后台扫描频率,默认值为10000。 如业务对延迟敏感,可适当加大扫描间隔,或关闭khugepaged整理功能。
  • 接口说明 软绑定功能开启时,cgroup组增加/sys/fs/cgroup/cpuacct/子cgroup/cpuacct.nr_select_allowed_cpus计数值,统计cgroup组内的任务在唤醒选核时,选择共享核的次数。 软绑定功能开启时,cgroup组增加/sys/fs/cgroup/cpuacct/子cgroup/cpuacct.nr_select_prefer_cpus计数值,统计cgroup组内的任务在唤醒选核时,选择优先核的次数 软绑定功能开启时,cgroup组增加/sys/fs/cgroup/cpuacct/子cgroup/cpuacct.nr_smoothed_prefer_cpus计数值,统计cgroup组内的任务在唤醒选核时,由于平滑算法没有从优先核飘到共享核的次数 提供/proc/sys/kernel/sched_dynamic_affinity_disable接口,用于禁用软绑定功能。参数值为0时表示软绑定开启,参数值为1时表示禁用软绑定。
  • 背景说明 做NUMA亲和性绑定后,假如两个VM负载很高,但其他VM空闲,空闲的CPU无法被利用。如果不做绑定,则无法有效利用NUMA亲和性,尤其整机繁忙情况下,性能严重下降。无论哪种方式都有缺陷,所以提供了软绑定方案: 优先使用preferred CPU:当preferred CPU利用率低于阈值时,优先使用preferred CPU。 允许使用allowed CPU:当preferred CPU利用率超过阈值时,在所有allowed CPU内选核。 该软绑定方案同样适用于容器场景。 preferred CPU为软绑定的优先调度CPU。 allowed CPU为通过sched_setaffinity或cgroup等设置的绑定的CPU列表。 为了能更直观地观测到软绑定的执行,增加了软绑定调度计数值;为了在不关机的情况下实现开启/关闭软绑定功能,增加了软绑定调度开关。
  • 约束限制 需要通过root用户权限使用,root用户具有系统最高权限,在使用root用户进行操作时,请严格按照操作指导进行操作,避免其他操作造成系统管理及安全风险。 设置preferred_cpuset后,只有进程在唤醒或周期负载均衡时才会重新选核。 软绑定在选择preferred CPU或allowed CPU时依赖pelt负载计算,1ms更新一次,所以如果负载频繁变化,会导致频繁选preferred CPU或allowed CPU。
  • 约束限制 只针对ESTABLISHED状态的TCP链接生效。 支持IPv4和IPv6,由于历史原因,TCP相关sysctl选项都挂在net.ipv4下,实际以net.ipv4.tcp打头的sysctl选项,对IPv4和IPv6均生效。 应用级TCP重传策略优先级高于其他全局级TCP重传配置。 定制TCP重传策略可能会增加系统负载,需要根据系统资源合理定制,建议定制的线性退避次数不超过6次。 如果定制的最大重传次数小于net.ipv4.tcp_retries1(默认值3),则将无法触发网络探测,可能导致部分网络变更场景报文不通。 如果定制的最大重传次数非0,则其必须大于等于线性退避次数,否则返回错误。 如果只定制最大重传间隔时间,不定制最大重传次数,那么实际最大重传次数可能会大于net.ipv4.tcp_retries2(默认值15,描述最大重传次数或时间,下简称R2)。RFC6069规定,如果R2使用次数描述,则必须换算成时间。换算过程需要用到最大重传时间,为避免使能本功能后TCP过早断连,该换算过程使用系统默认TCP_RTO_MAX(120s)而不是定制的最大重传时间,因此对外表现为实际重传次数多于R2。 由于TCP-TLP算法,未收到ACK的尾包可能会被Loss Probe定时器选中做一次重传,用于后续触发快速重传。该次重传不计入本功能定制的重传次数内。
  • 使用说明 开启TCP重传策略定制能力。通过如下命令,将net.ipv4.tcp_sock_retrans_policy_custom配置为1: [root@localhost ~]# sysctl -w net.ipv4.tcp_sock_retrans_policy_custom=1 设置线性退避4次,最大重传10次,最大重传间隔时间20秒: tcp_sock_retrans_policy policy = {0}; policy.tcp_linear_timeouts_times = 4; policy.tcp_retries_max = 10; policy.tcp_rto_max = 20; setsockopt(sockfd, SOL_TCP, TCP_SOCK_RETRANS_POLICY_CUSTOM, (const void*)&policy, sizeof(struct tcp_sock_retrans_policy)); 恢复为默认策略: tcp_sock_retrans_policy policy = {0}; setsockopt(sockfd, SOL_TCP, TCP_SOCK_RETRANS_POLICY_CUSTOM, (const void*)&policy, sizeof(struct tcp_sock_retrans_policy)); 关闭TCP重传策略定制能力: [root@localhost ~]# sysctl -w net.ipv4.tcp_sock_retrans_policy_custom=0 定制TCP重传策略功能在HCE2.0版本内核进行修改,在HCE2.0版本glibc中使用该功能,需要在用户态代码中添加TCP_SOCK_RETRANS_POLICY_CUSTOM 宏以及对应的结构体tcp_sock_retrans_policy。
  • 约束限制 程序未按照2MB对齐编译时,每段中不足2MB的部分无法使用大页,建议对齐使用。 mprotect系统调用要求传入的地址按2M对齐、大小为2M的倍数,程序代码需要进行适配修改。 2MB地址对齐需要重新编译程序,并在链接器选项中加入"-Wl,-zcommon-page-size=2097152 -Wl,-zmax-page-size=2097152" 大页预留不足时会尝试申请2MB页,如果由于内存碎片等原因申请失败时,程序会回退至小页。程序中多个线程进入回退小页流程会触发SIGBUS。
  • CPU硬件特性设置 通过用户态工具 UcpuHconfig可进行CPU硬件特性设置,下表列出其配置项和使用实例等。 UcpuHconfig命令执行成功后会保存配置,os重启后自动恢复。 表1 UcpuHconfig使用说明 功能 使用说明 参数1 参数2 示例 备注 spill L3缓存是否溢出 观察每个L3的流量。 每个L3流量平均,建议关spill;L3流量一部分高,一部分空闲,建议开spill。 spill [on|off] UcpuHconfig --spill on - write unique share 设置cpu缓存的状态 观察业务热点和数据流。 有连续写多cacheline的行为(例如memcpy),使能特性能优化带宽。 write_unique_share [on|off] UcpuHconfig --write_unique_share on - cache line替换算法 Topdown观察到后端bound 50%以上,并且有L3 bound,尝试修改替换算法,比较各个算法的实际效果。 cacheline 整数(代表策略) UcpuHconfig --cacheline 0 - prefetch L3从ddr的预取 Topdown观察到后端bound 40%以上,并且有L3 bound,并且抓到单die DDR带宽大(20G以上)。关闭prefetch 可以节省DDR带宽。 prefetchtgt_en [on|off] UcpuHconfig --prefetchtgt_en 0 0: 随机算法 1: drrip算法 2: plru 3: 随机算法 reg evict disable 缓存驱逐时是否通知ddr Topdown观察到后端bound,再观察每个L3的流量,出现L3流量部分空闲部分繁忙,打开配置。 reg_evict_disable [on|off] UcpuHconfig --reg_evict_disable on - reg evict selfsnp disable 缓存驱逐时是否通知其他cpu Topdown观察到后端bound 40%以上,并且有L3 bound,打开配置。 reg_evict_selfsnp_disable [on|off] UcpuHconfig --reg_evict_selfsnp_disable on - prefetch L3 cpu从L3的预取 Topdown观察到后端bound,并且有L3 bound,如果DDR带宽大,可以尝试关预取 prefetch_l3 [on|off] UcpuHconfig --prefetch_l3 on - 查看 查看硬件特殊设置情况 show [功能名 | all] UcpuHconfig --show spill UcpuHconfig --show all - 父主题: 应用加速工具
  • 权重弱调度(policy=6) 权重弱调度表示按照每个容器的算力比例为容器分配时间片,隔离性弱于权重抢占调度。XGPU服务会从算力单元1开始调度,但如果某个算力单元没有分配给某个容器,或者容器内没有进程打开GPU设备,则跳过调度切换到下一个时间片。例如为容器1、2、3分别分配5%、5%、10%的算力,则容器1、2、3分别占用1、1、2个算力单元。图中白色部分的算力单元表示容器3的空闲算力,图中白色部分和灰色部分的算力单元表示被跳过不参与调度。 本例中容器1、2、3占用的实际算力百分比为50%、50%、0%。 图7 权重弱调度 权重弱调度涉及空闲算力的抢占和抢回,因此容器在空闲和忙碌之间切换时会影响其他容器的算力,该算力波动属于正常情况。当某个容器从空闲切换到忙碌时,其抢回算力的时延不超过100ms。
  • 混合调度(policy=5) 混合调度表示单张GPU卡支持单显存隔离和算力显存隔离类型。其中算力显存隔离的容器其隔离效果同固定算力(policy=1)完全一致,单显存隔离的容器共享算力显存隔离的容器分配后剩余的GPU算力。以max_inst=20为例,容器1、2为算力显存隔离容器,其分配的算力分别为5%、10%,容器3、4为单显存隔离的容器,则容器1、2分别占用1、2个算力单元,容器3、4共享剩余17个算力单元。此外,当容器2中没有进程打开GPU设备时,则容器1、2分别占用1、0个算力单元,容器3、4共享剩余19个算力单元。 在混合调度下,根据GPU_CONTAINER_QUOTA_PERCENT是否为0来区分容器是否开启算力隔离,GPU_CONTAINER_QUOTA_PERCENT为0的所有容器共享GPU的空闲算力。 图6 混合调度 混合调度策略不支持高优先级容器。