微笑笑西西
作者微笑笑西西·2024-02-04 09:02
系统管理/架构分析·某城市商业银行

中小银行银河麒麟操作系统性能优化实战经验

字数 8445阅读 2012评论 3赞 5

随着企业版信创系统的普及,操作系统对信创产业发展的重要性不言而喻,无论是大数据、区块链、云计算,还是火遍全球的人工智能,操作系统都是这些产业发展的核心和基础。国产操作系统由于发展时间较短,在实际运用于生产环境时,必须进行合理地系统调优才能产出最佳实践,调优有助于提高操作系统的性能和可维护性,增加上下游生态的兼容性,降低运维成本。本文将从系统运维的角度,罗列影响服务器版麒麟操作系统性能的主要因素,详细介绍一些调优实践和系统性能监控工具,以期对服务器版麒麟操作系统调优提供运维经验和参考。

1 影响性能的主要因素

1.1 硬件设备

不同的硬件设备,即便配置完全相同,实际使用当中性能上也会略有差异。为了排除不同机器导致的性能差异,可以在同一台机器上面以相同配置安装不同的操作系统,并可以随时进行切换。在安装不同操作系统时,系统组件务必尽量保持一致。

1.2 BIOS

BIOS当中会有一些提升性能的选项,这些选项通常会跟硬件有关。选项打开后,性能一般会有一定的提升。

1.3 系统服务

系统之中的一些服务会对性能有影响,比如selinux,auditd,firewalld,irqbalance等。在对比两个系统之中的服务之时,要保证两个系统之中这些影响性能的服务的开启和关闭的状态要保持一致。如果可以,尽量在关闭这些服务的状态下测试,以排除这些服务对性能的影响。在关闭这些服务之后,性能通常会有一定的提升。

1.4 内核

内 核作为操作系统之中最重要的部分,对性能有非常大的影响 , 内核对性能的影响因素包括内核版本,内核补丁,编译选项,内核参数等几项 。 在内核版本之外,不同硬件厂商可能会有针对内核的补丁,这些补丁对性能可能会有影响,可以联系厂商以获取这些补丁。 麒麟系统 内核的编译选项可以通过/boot/config-*文件来查看。

1.5 库

库对性能的影响可以分为两个方面。第一,测试程序链接动态库的多寡。通常来说,链接的动态库较多,则性能会略有下降。 麒麟系统 链接的动态库可以通过ldd命令查看。第二,链接的动态库及动态库的版本。这种情况可以通过安装不同的动态库或不同版本的动态库,并重新编译之后,测试进行确定。 在编译测试程序时, 麒麟系统 使用LD_PRELOAD和-Wl,--rpath的方式来指定所要链接的动态库 , 但是此种方式会存在一定失败的可能。如果测试程序链接的动态库比较多,最好能够一个一个的进行替换,这样可以确定具体是哪一个动态库对性能的影响比较大。

1.6 编译器

编译器对性能的影响主要分为版本和参数两个方面。版本的影响可以通过GCC的升级来确定,默认参数的影响可以通过两个命令来确定,gcc -v来确定是否使用了特殊的spec,gcc -dumpspecs来确定是否使用了特别的编译或者链接选项。

1.7 磁盘和文件系统

磁盘的容量和种类(HDD或SSD)对性能 有较大 的影响 , 分区类型和挂载参数等也会对性能有一定的影响 。 如 测试分区为tmpfs,可以提高部分测试程序的分数 , 修改IO调度器,会对此部分的性能有影响 。

1.8 JVM虚拟机

JVM虚拟机对性能的影响主要在版本和参数两个方面。由于jvm的测试工具为SPECjvm2008,而通常可用的JDK的版本为jdk-1.7和jdk-1.8。在某些环境下,jdk-1.7的跑分要高出jdk-1.8,但是最好能够在实际的环境中测试来确定采用的版本。Jvm的启动参数对性能会有影响,其中比较大的为-Xms$$m,-Xmx$$m两项,其余还有-Xmn$$m,-Xss$$k等。这些选项均要在具体的环境下进行调整,以达到最佳的组合。

1.9 Shell

Shell对性能的影响主要在版本和什么Shell两个方面。例如 统信系统d 版本的shell采用的并不是bash,而是dash。以上两个方面可以通过shell的升级和更换来确定是否会影响到性能。

2 麒麟系统常用性能工具

由于麒麟系统底层是基于Centos做的开发,因此常用性能工具跟redhat大致相同,下面列举几个常用的供参考。

2.1 vmstat(虚拟内存统计)

vmstat(VirtualMeomoryStatistics,虚拟内存统计) 是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。
vmstat的常规用法:vmstat interval times即每隔interval秒采样一次,共采样times次,如果省略times,则一直采集数据,直到用户手动停止为止。

可以使用ctrl+c停止vmstat采集数据。
第一行显示了系统自启动以来的平均值,第二行开始显示现在正在发生的情况,接下来的行会显示每5秒间隔发生了什么,每一列的含义在头部,如下所示:
▪ procs:r这一列显示了多少进程在等待cpu,b列显示多少进程正在不可中断的休眠(等待IO)。
▪ memory:swapd列显示了多少块被换出了磁盘(页面交换),剩下的列显示了多少块是空闲的(未被使用),多少块正在被用作缓冲区,以及多少正在被用作操作系统的缓存。
▪ swap:显示交换活动:每秒有多少块正在被换入(从磁盘)和换出(到磁盘)。
▪ io:显示了多少块从块设备读取(bi)和写出(bo),通常反映了硬盘I/O。
▪ system:显示每秒中断(in)和上下文切换(cs)的数量。
▪ cpu:显示所有的cpu时间花费在各类操作的百分比,包括执行用户代码(非内核),执行系统代码(内核),空闲以及等待IO。
内存不足的表现:free memory急剧减少,回收buffer和cacher也无济于事,大量使用交换分区(swpd),页面交换(swap)频繁,读写磁盘数量(io)增多,缺页中断(in)增多,上下文切换(cs)次数增多,等待IO的进程数(b)增多,大量CPU时间用于等待IO(wa)。

2.2 iostat(IO性能分析工具)

iostat用于报告中央处理器(CPU)统计信息和整个系统、适配器、tty 设备、磁盘和 CD-ROM 的输入/输出统计信息,默认显示了与vmstat相同的cpu使用信息,使用以下命令显示扩展的设备统计:

第一行显示的是自系统启动以来的平均值,然后显示增量的平均值,每个设备一行。常见linux的磁盘IO指标的缩写习惯:rq是request,r是read,w是write,qu是queue,sz是size,a是verage,tm是time,svc是service。
rrqm/s和wrqm/s:每秒合并的读和写请求,“合并的”意味着操作系统从队列中拿出多个逻辑请求合并为一个请求到实际磁盘。
r/s和w/s:每秒发送到设备的读和写请求数。
rsec/s和wsec/s:每秒读和写的扇区数。
avgrq –sz:请求的扇区数。
avgqu –sz:在设备队列中等待的请求数。
await:每个IO请求花费的时间。
svctm:实际请求(服务)时间。
%util:至少有一个活跃请求所占时间的百分比。

2.3 iotop(进程实时监控工具)

iotop命令是专门显示硬盘IO的命令,界面风格类似top命令,可以显示IO负载具体是由哪个进程产生的。是一个用来监视磁盘I/O使用状况的top类工具,具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息。

可以以非交互的方式使用:iotop –bod interval,查看每个进程的I/O 。

2.4 pidstat(监控系统资源情况)

pidstat主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等。
使用方法:pidstat –d interval;

pidstat还可以用以统计CPU使用信息:pidstat –u interval;

统计内存信息:pidstat –r interval。

2.5 top(实时显示 process 的动态)

top命令的汇总区域显示了五个方面的系统性能信息:
负载:时间,登陆用户数,系统平均负载;
进程:运行,睡眠,停止,僵尸;
cpu:用户态,核心态,NICE,空闲,等待IO,中断等;
内存:总量,已用,空闲(系统角度),缓冲,缓存;
交换分区:总量,已用,空闲
任务区域默认显示:进程ID,有效用户,进程优先级,NICE值,进程使用的虚拟内存,物理内存和共享内存,进程状态,CPU占用率,内存占用率,累计CPU时间,进程命令行信息

2.6 netstat(网络状态)

Netstat用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
常见用法:
netstat -npl: 可以查看你要打开的端口是否已经打开。

3 麒麟系统硬件层调优实践

3.1 修改内存透明大页设置

在实际操作过程中,在硬件层通常会进行关闭透明大页配置,但 不同的内存透明大页在不同场景下性能不同,需根据具体业务调整。
查看支持的设置,[]中即为当前的设置:
cat /sys/kernel/mm/transparent_hugepage/enabled

修改设置:
echo always > /sys/kernel/mm/transparent_hugepage/enabled

3.2 特殊调优

FT2500芯片物理机安装麒麟V10SP1系统后,因kdump服务无法启动导致无法生成vmcore,这将导致系统故障时无法搜集coredump,针对FT2500芯片物理机的调优如下:

3.2.1 机型1

在擎天EF862 FT-S2500昆仑固件v4.0服务器进行如下操作,
(1)BIOS操作
重启服务进入固件配置界面, 按以下3个图的步骤 进行修改配置,完成之后保存配置进入系统 。



(2)修改 kdump 配置文件
修改/etc/sysconfig/kdump文件,然后在执行kdumpctl rebuild,重启系统。修改内容如下:
KDUMP_COMMANDLINE_APPEND="1 nr_cpus=65 cma=0 numa=off irqpoll reset_devices
cgroup_disable=memory udev.children-max=2 panic=10 swiotlb=noforce novmcoredd"

3.2.2 机型2

擎天EF862 FT-S2500长城固件v3.0服务器,此机型固件中没有 gicd 选项,需进入 BIOS,将CPU配置中的“IOMMU 选项”设置为启用,并保存退出。

3.2.3 机型3

长城超云 FT-S2500中电科技KL4.26.CC.S.019.120322.D.Test服务器,此机型固件中没有gicd选项, 也 需进入BIOS,将CPU配置中的“IOMMU 选项”设置为启用,并保存退出。
以上三款机型在完成调优配置之后,均需要将kexec-tool升级到kexec-tools-2.0.20-14.p02.ky10.aarch64 版本以上,升级完成之后执行systemctl restart kdump重启服务,然后查看systemctl status kdump状态,保证服务启动成功。
最后在终端执行echo c > /proc/sysrq-trigger 触发 panic,执行等待2到5分钟,系统会自动重启进入系统,此时/var/crash 目录产生 vmcore 文件。

4 麒麟系统软件层调优实践

麒麟系统上游软件为Centos,系统标准设置与Linux大致相同,这里就不赘述,着重进行系统软件层调优实践介绍。

4.1 CPU与内存子系统性能调优

4.1.1 CPU绑定

减少跨NUMA访问内存带来的性能下降 , 对一般场景均有效。
针对使用openmp库创建多线程的程序,可以使用export GOMP_CPU_AFFINITY=0,1,3,16-17的方式绑定每个线程使用的CPU core。
使用numactl的方式来绑定使用的CPU core:numactl -C 24-27 ./program
使用taskset的方式来绑定使用的CPU core:taskset -c 0,3,7-11 ./program
对于已经启动的程序,则可以先获取程序的pid:taskset -pc 0,3,7-11 $pid

4.1.2 修改CPU预取的开关

提前将内存中的数据读取到CPU的高速缓冲Cache当中。
对数据比较集中的场景,预取的命中率高,适合打开CPU预取,反之需要关闭CPU预取。
BIOS中CPU Prefetching Configuration选项

4.2 网络子系统性能调优

4.2.1 修改PCIE Max Payload Size大小设置

提高PCIE链路带宽的利用率,对一般场景均有效。BIOS中Max Payload Size的值设置为512B 。

4.2.2网络NUMA绑定CPU

将程序绑定到网卡所在的 numa 节点,减少跨 numa 访问带来的性能下降。
对一般场景均有效。
使用 ethtool -i ethX 查询网卡的信息,查看其中的 bus_info 。

然后使用 cat /sys/bus/pci/devices/$bus_info/numa_node 查看网卡所在的 numa 节点。

再通过 numactl -N $numa_node ./program 的方式进行应用程序的绑定。

4.3 磁盘IO子系统性能调优

4.3.1 调整脏数据刷新策略

修改脏数据在缓存中允许保留的时长。如果业务的数据性是连续性的写,可以适当调小此参数。方法:
echo 2000 > /proc/sys/vm/dirty_expire_centisecs

修改脏页面占用总内存最大的比例,系统会分配更多的内存用于写缓冲,可提高写磁盘性能。如果业务以磁盘写入操作为主,可以调小这个值,避免数据积压太多,造成瓶颈。需根据具体业务来调整。方法:
echo 8 > /proc/sys/vm/dirty_background_ratio

修改脏页面内占用总内存最大的比例。超出这个值,系统的文件读写会变成同步模式,性能下降。对于写入为主的业务,可以适当增加此参数,避免磁盘过早进入到同步写状态。方法:
echo 50 > /proc/sys/vm/dirty_ratio

4.3.2 修改磁盘文件预读参数

调整磁盘数据预读的大小。
磁盘顺序读时增加此参数,有利于提高性能,其它场景则会降低,需根据实际业务来调整。
将预读调整为4096KB,方法:
echo 4096 > /sys/block/$sdx/queue/read_ahead_kb

4.3.3 修改磁盘IO调度方式

不同IO调度方式有不同的应用场景,需根据具体业务来选择。 方法:
通过以下命令查看支持的IO调度模式,即为当前的IO调度模式。
cat /sys/block/$sdxxx/queue/scheduler
通过以下命令修改IO调度模式。
echo mq-deadline > /sys/block/$sdxxx/queue/scheduler

4.3.4 文件系统参数优化

选用性能更优的文件系统或者有别的替代方案时去掉文件系统的日志等功能有助于提高性能。
选用xfs文件系统
系统安装时选择格式化为xfs格式。
手动格式化命令:
mkfs.xfs /dev/sdxxxx
增大文件系统的block,适用于大文件的操作场景。
mkfs.xfs /dev/sda1 -b size=8192

4.3.5 使用异步文件操作来提升系统性能

使用磁盘文件的异步读取机制,可以使得文件读写不用阻塞,便于提升文件系统性能。需应用支持相应的异步文件操作库,并需要使用libaio库重编译应用。

4.4 应用程序调优

4.4.1 OpenJDK JVM

增大JVM可以使用的内存有助于提升java的性能(SPECjvm测试验证)。修改JVM可以使用的内存, 方法如下:
Java在执行时添加以下参数,参数中具体数值为在512G内存下测试SPECjvm得出,具体业务需根据具体情况来调整其中的数值:
java -Xms350g -Xmx480g -Xmn350g -Xss128m xxxxx
还可以使用NUMA进行调优,Java在执行时添加以下参数,参数效果为测试SPECjvm过程中得出,具体业务效果需以业务为准:
java -XX:UseNUMA -XX:TieredCompilation -XX:TieredStopAtLevel=1 xxxx

4.4.2 普通用户配置crontab权限

麒麟系统中,普通用户默认没有crontab权限,大多需要进行调优配置,以下是给appuser用户配置crontab权限命令 :
echo appuser >> /etc/cron.allow

4.5 系统监控工具

在配置系统之外,掌握收集基本的系统信息的方法也很重要,服务器版麒麟系统除了用命令行查看系统资源使用情况(命令与redhat一样,这里就不赘述了),还 可以在系统监控工具的图形界面上查看和查找进程,改变进程的优先级以及杀死进程。 开始->所有程序->系统工具->系统监视器 点击打开,如下图 :

对于列出的进程,系统监控工具会显示进程的名字、状态、进程NICE 值、 进程使用内存和 CPU 的百分比、进程的 PID、进程等待的通道和进程会话的其它细节。通过点击进程名字栏可以将进程显示的信息进行升序或降序排列。
默认系统监控工具会显示当前登录用户的进程列表,通过选择查看菜单下的不同选项,可查看活动的进程、查看所有进程、查看当前登录用户的进程、查看进程依赖,还可以通过按钮刷新进程列表,选中进程后杀死进程。
资源标签页 可以查看系统中空闲的内存大小和已经使用的大小,点击资源标签页查看系统内存使用情况

文件系统标签页 可以以图表的方式查看文件系统和磁盘空间的使用情况。

每一个列出的文件系统,系统监控工具都会显示原设备,目标挂载点,文件系统类型和大小,磁盘空间使用大小和未使用大小。

5 麒麟系统TDSQL数据库调优实践

TDSQL数据库应用于信创操作系统时,主要要进行超线程状态(ARM架构不涉及)、cpu性能模式、透明大页状态、环境变量和启动脚本调优。

5.1 超线程状态调优

确认X86架构服务器开启超线程,以便TDSQL数据库进行调用,命令如下:
uname -r |grep -q "x86_64" && lscpu |egrep "Thread\(s\) per core" |awk '{print $NF}'
返回结果:2为 超线程已处于开启状态。

5.2 CPU性能调优

CPU性能模式为performance,这样调优的目的可以让TDSQL充分利用CPU资源:
cpupower frequency-info -g performance|grep "Not Available" |wc -l

5.3 透明大页调优

ARM架构服务器使用TDSQL数据库,需要关闭透明大页,减少内存交换次数,提高数据库性能,命令如下:
grep -i AnonHugePages /proc/meminfo|awk '{print $2}'|sed 's/ //'
# 查看目前透明大页内存为0
cat /sys/kernel/mm/transparent_hugepage/enabled |grep never|wc -l
# 查看值为1

5.4 环境变量和启动脚本调优

对于使用了麒麟操作系统的信创服务器,需要对系统环境变量和启动脚本中的SSS_NSS_USE_MEMCACHE参数检查,命令如下:
grep -i "export SSS_NSS_USE_MEMCACHE=NO" /data/oc_agent/bin/start_agent.sh | wc -l
返回行数等于1
grep -i "export SSS_NSS_USE_MEMCACHE=NO" /home/tdsql/.bash_profile |wc -l
返回行数等于1

6 总结

麒麟操作系统调优不仅有助于提高系统性能、提高自主可控能力、促进国产化技术创新,还可以节约成本、带来更好的用户体验,提升金融业的实际收益 。 在调优过程中,需要从实际应用出发,满足不同场景的特定需求,对不同场景采取不同的性能调优策略,以期达到最佳性能实践。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

5

添加新评论3 条评论

道满道满系统架构师某科技公司
3天前
对于需要使用Java运行的程序,其实可以考虑使用非openJDK的商业版JDK,比如zulu17等,在部分业务中性能可以提升很多
pysx0503pysx0503系统工程师第十区。散人
2024-02-22 18:25
很实用的优化经验,从实战的角度简单明了的分享了从性能监控到调优的基本思路和方法。不同的操作系统对业务的影响或多或少都会有些不同。掌握各种系统的监控工具和基本的调优参数是系统工程师的必备技能,
kangkang0020kangkang0020信息技术经理中信银行长春分行
2024-02-22 14:23
进阶版的实用操作手册,很详细的调优和实用工作经验分享。感谢作者。
Ctrl+Enter 发表

本文隶属于专栏

最佳实践
不同的领域,都有先行者,实践者,用他们的最佳实践来加速更多企业的建设项目落地。

作者其他文章

相关文章

相关问题

相关资料

X社区推广