-
问题描述:我需要在欧拉系统上安装atop工具,但欧拉系统无法上网,我要从哪里下载得到这个atop工具呢?(如果没有好的办法,我可以先把包下载到windows系统然后再上传到欧拉系统上去)发行版本:[root@linksoft-3 sysomc]# cat /etc/*release EulerOS release 2.0 (SP11) 内核版本:[root@linksoft-3 sysomc]# uname -r 5.10.0-60.18.0.50.h1479.eulerosv2r11.aarch64
-
$ gs_install -X /opt/software/openGauss/cluster_config.xml --gsinit-parameter="--locale=zh_CN.UTF-8"Parsing the configuration file.Check preinstall on every node.Successfully checked preinstall on every node.Creating the backup directory.Successfully created the backup directory.begin deploy..Installing the cluster.begin prepare Install Cluster..Checking the installation environment on all nodes.begin install Cluster..Installing applications on all nodes.Successfully installed APP.begin init Instance..encrypt cipher and rand files for database.Please enter password for database:Please repeat for database:begin to create CA cert filesThe sslcert will be generated in /opt/huawei/install/app/share/sslcert/omNO cm_server instance, no need to create CA for CM.Non-dss_ssl_enable, no need to create CA for DSSCluster installation is completed.Configuring.Deleting instances from all nodes.Successfully deleted instances from all nodes.Checking node configuration on all nodes.Initializing instances on all nodes.Updating instance configuration on all nodes.Check consistence of memCheck and coresCheck on database nodes.Configuring pg_hba on all nodes.Configuration is completed.Using omm:dbgroup to install database.Using installation program path : /opt/huawei/install/app_33b035fd$GAUSSHOME points to /opt/huawei/install/app_33b035fd, no need to create symbolic link.Traceback (most recent call last): File "/opt/huawei/install/om/script/local/Install.py", line 812, in <module> functionDict[g_opts.action]() File "/opt/huawei/install/om/script/local/Install.py", line 743, in startCluster dn.start(self.time_out) File "/opt/huawei/install/om/script/local/../gspylib/component/Kernel/Kernel.py", line 104, in start raise Exception(ErrorCode.GAUSS_516["GAUSS_51607"] % "instance"Exception: [GAUSS-51607] : Failed to start instance. Error: Please check the gs_ctl log for failure details.[2024-10-16 10:32:52.678][21933][][gs_ctl]: gs_ctl started,datadir is /opt/huawei/install/data/dn [2024-10-16 10:32:52.740][21933][][gs_ctl]: waiting for server to start....0 LOG: [Alarm Module]can not read GAUSS_WARNING_TYPE env.0 LOG: [Alarm Module]Host Name: tims-ai-6-1 0 LOG: [Alarm Module]Host IP: tims-ai-6-1. Copy hostname directly in case of taking 10s to use 'gethostbyname' when /etc/hosts does not contain <HOST IP>0 LOG: [Alarm Module]Cluster Name: dbCluster 0 LOG: [Alarm Module]Invalid data in AlarmItem file! Read alarm English name failed! line: 580 WARNING: failed to open feature control file, please check whether it exists: FileName=gaussdb.version, Errno=2, Errmessage=No such file or directory.0 WARNING: failed to parse feature control file: gaussdb.version.0 WARNING: Failed to load the product control file, so gaussdb cannot distinguish product version.0 LOG: bbox_dump_path is set to /opt/huawei/corefile/2024-10-16 10:32:52.869 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 DB010 0 [REDO] LOG: Recovery parallelism, cpu count = 8, max = 4, actual = 42024-10-16 10:32:52.869 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 DB010 0 [REDO] LOG: ConfigRecoveryParallelism, true_max_recovery_parallelism:4, max_recovery_parallelism:4gaussdb.state does not exist, and skipt setting since it is optional.2024-10-16 10:32:52.892 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: [Alarm Module]can not read GAUSS_WARNING_TYPE env.2024-10-16 10:32:52.892 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: [Alarm Module]Host Name: tims-ai-6-1 2024-10-16 10:32:52.892 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: [Alarm Module]Host IP: tims-ai-6-1. Copy hostname directly in case of taking 10s to use 'gethostbyname' when /etc/hosts does not contain <HOST IP>2024-10-16 10:32:52.892 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: [Alarm Module]Cluster Name: dbCluster 2024-10-16 10:32:52.892 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: [Alarm Module]Invalid data in AlarmItem file! Read alarm English name failed! line: 582024-10-16 10:32:52.918 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: loaded library "security_plugin"2024-10-16 10:32:52.923 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets2024-10-16 10:32:52.923 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets2024-10-16 10:32:52.932 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: InitNuma numaNodeNum: 1 numa_distribute_mode: none inheritThreadPool: 0.2024-10-16 10:32:52.933 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: reserved memory for backend threads is: 340 MB2024-10-16 10:32:52.933 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: reserved memory for WAL buffers is: 320 MB2024-10-16 10:32:52.933 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: Set max backend reserve memory is: 660 MB, max dynamic memory is: 4079 MB2024-10-16 10:32:52.933 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: shared memory 4476 Mbytes, memory context 4739 Mbytes, max process memory 10240 Mbytes2024-10-16 10:32:52.933 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: shared memory that key is 5432001 is owned by pid 122722024-10-16 10:32:53.927 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [CACHE] LOG: set data cache size(805306368)2024-10-16 10:32:55.039 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [SEGMENT_PAGE] LOG: Segment-page constants: DF_MAP_SIZE: 8156, DF_MAP_BIT_CNT: 65248, DF_MAP_GROUP_EXTENTS: 4175872, IPBLOCK_SIZE: 8168, EXTENTS_PER_IPBLOCK: 1021, IPBLOCK_GROUP_SIZE: 4090, BMT_HEADER_LEVEL0_TOTAL_PAGES: 8323072, BktMapEntryNumberPerBlock: 2038, BktMapBlockNumber: 25, BktBitMaxMapCnt: 5122024-10-16 10:32:55.206 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: gaussdb: fsync file "/opt/huawei/install/data/dn/gaussdb.state.temp" success2024-10-16 10:32:55.206 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: create gaussdb state file success: db state(STARTING_STATE), server mode(Normal), connection index(1)2024-10-16 10:32:55.236 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: max_safe_fds = 974, usable_fds = 1000, already_open = 16bbox_dump_path is set to /opt/huawei/corefile/2024-10-16 10:32:55.240 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: user configure file is not found, it will be created.[2024-10-16 10:32:58.748][21933][][gs_ctl]: gaussDB state is Coredump[2024-10-16 10:32:58.748][21933][][gs_ctl]: stopped waiting[2024-10-16 10:32:58.748][21933][][gs_ctl]: could not start serverExamine the log output.[GAUSS-51607] : Failed to start instance. Error: Please check the gs_ctl log for failure details.[2024-10-16 10:32:52.678][21933][][gs_ctl]: gs_ctl started,datadir is /opt/huawei/install/data/dn [2024-10-16 10:32:52.740][21933][][gs_ctl]: waiting for server to start....0 LOG: [Alarm Module]can not read GAUSS_WARNING_TYPE env.0 LOG: [Alarm Module]Host Name: tims-ai-6-1 0 LOG: [Alarm Module]Host IP: tims-ai-6-1. Copy hostname directly in case of taking 10s to use 'gethostbyname' when /etc/hosts does not contain <HOST IP>0 LOG: [Alarm Module]Cluster Name: dbCluster 0 LOG: [Alarm Module]Invalid data in AlarmItem file! Read alarm English name failed! line: 580 WARNING: failed to open feature control file, please check whether it exists: FileName=gaussdb.version, Errno=2, Errmessage=No such file or directory.0 WARNING: failed to parse feature control file: gaussdb.version.0 WARNING: Failed to load the product control file, so gaussdb cannot distinguish product version.0 LOG: bbox_dump_path is set to /opt/huawei/corefile/2024-10-16 10:32:52.869 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 DB010 0 [REDO] LOG: Recovery parallelism, cpu count = 8, max = 4, actual = 42024-10-16 10:32:52.869 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 DB010 0 [REDO] LOG: ConfigRecoveryParallelism, true_max_recovery_parallelism:4, max_recovery_parallelism:4gaussdb.state does not exist, and skipt setting since it is optional.2024-10-16 10:32:52.892 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: [Alarm Module]can not read GAUSS_WARNING_TYPE env.2024-10-16 10:32:52.892 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: [Alarm Module]Host Name: tims-ai-6-1 2024-10-16 10:32:52.892 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: [Alarm Module]Host IP: tims-ai-6-1. Copy hostname directly in case of taking 10s to use 'gethostbyname' when /etc/hosts does not contain <HOST IP>2024-10-16 10:32:52.892 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: [Alarm Module]Cluster Name: dbCluster 2024-10-16 10:32:52.892 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: [Alarm Module]Invalid data in AlarmItem file! Read alarm English name failed! line: 582024-10-16 10:32:52.918 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: loaded library "security_plugin"2024-10-16 10:32:52.923 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets2024-10-16 10:32:52.923 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 01000 0 [BACKEND] WARNING: could not create any HA TCP/IP sockets2024-10-16 10:32:52.932 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: InitNuma numaNodeNum: 1 numa_distribute_mode: none inheritThreadPool: 0.2024-10-16 10:32:52.933 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: reserved memory for backend threads is: 340 MB2024-10-16 10:32:52.933 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: reserved memory for WAL buffers is: 320 MB2024-10-16 10:32:52.933 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: Set max backend reserve memory is: 660 MB, max dynamic memory is: 4079 MB2024-10-16 10:32:52.933 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: shared memory 4476 Mbytes, memory context 4739 Mbytes, max process memory 10240 Mbytes2024-10-16 10:32:52.933 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: shared memory that key is 5432001 is owned by pid 122722024-10-16 10:32:53.927 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [CACHE] LOG: set data cache size(805306368)2024-10-16 10:32:55.039 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [SEGMENT_PAGE] LOG: Segment-page constants: DF_MAP_SIZE: 8156, DF_MAP_BIT_CNT: 65248, DF_MAP_GROUP_EXTENTS: 4175872, IPBLOCK_SIZE: 8168, EXTENTS_PER_IPBLOCK: 1021, IPBLOCK_GROUP_SIZE: 4090, BMT_HEADER_LEVEL0_TOTAL_PAGES: 8323072, BktMapEntryNumberPerBlock: 2038, BktMapBlockNumber: 25, BktBitMaxMapCnt: 5122024-10-16 10:32:55.206 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: gaussdb: fsync file "/opt/huawei/install/data/dn/gaussdb.state.temp" success2024-10-16 10:32:55.206 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: create gaussdb state file success: db state(STARTING_STATE), server mode(Normal), connection index(1)2024-10-16 10:32:55.236 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: max_safe_fds = 974, usable_fds = 1000, already_open = 16bbox_dump_path is set to /opt/huawei/corefile/2024-10-16 10:32:55.240 670f25d4.1 [unknown] 139861824102464 [unknown] 0 dn_6001 00000 0 [BACKEND] LOG: user configure file is not found, it will be created.[2024-10-16 10:32:58.748][21933][][gs_ctl]: gaussDB state is Coredump[2024-10-16 10:32:58.748][21933][][gs_ctl]: stopped waiting[2024-10-16 10:32:58.748][21933][][gs_ctl]: could not start serverExamine the log output.安装环境:系统是NAME="openEuler" VERSION="22.03 (LTS-SP3)下载的gauss版本:openGauss-5.0.1-openEuler-64bit-all.tar.gz系统32GB内存
-
现在我需要对LLC进行调优,发现BIOS里面有这些地方涉及LLC但是不知道Cache Moded和Stream Write Mode的各个选项的区别在哪里https://bbs.huaweicloud.com/forum/thread-102569-1-1.html这个帖子里有人回答了第一个问题,但是链接失效了.希望有大佬解惑!
-
本训练营将带领开发者掌握欧拉操作系统的使用,及学会如何从Cent OS切换至Huawei Cloud EulerOS,让自身技术之路行稳致远,实现云上创新~干货满满易学好懂,赶快报名提升自己吧!项目管理、配置管理、代码检查、编译、构建、测试、部署、发布等。活动截至时间:2024年10月30日 23:59: 59活动流程Step1. 点击报名活动Step2. 完成以下内容至少一项课程/实验的学习,截图100%进度并在此论坛贴下评论打卡(一)openEuler基础掌握openEuler操作系统及社区介绍命令行操作基础文本编辑器及文本处理用户和权限管理安装软件并管理服务管理文件系统及存储系统管理使用shell脚本Samba文件共享服务器管理(二)openEuler命令使用openEuler基础命令体验openEuler文件/目录的增删改查openEuler文件/目录权限修改openEuler修改文件/目录所有者openEuler文件/目录所属组修改openEuler查看磁盘使用空间openEuler创建文件/目录链接openEuler创建/删除用户openEuler 用户密码管理openEuler切换用户权限openEuler创建/删除用户组openEuler用户所属组变更openEuler用户/用户组编辑openEuler 的查询命令openEuler查找文件/目录(三)云上进切换操作系统两步切换国产操作系统Huawei Cloud EulerOSStep3. 云声建议——点击>>云声平台,登录发表用户体验,产品建议可领取反馈礼品标题需以参与活动名称+产品体验建议的形式命名 ,例如【欧拉操作系统入门训练营】+体验建议内容正文:Huawei Cloud EulerOS以及对应的使用详细描述,尽量附带截图以及链接地址等提交建议后,客服团队在2个工作日内进行预审, 每月活动结束后,根据建议预审和采纳情况评选,届时评选获奖用户,公布获奖名单并发放奖品活动规则1、点击报名,并完成至少一节课程或沙箱的学习,完成论坛打卡后,可点击申请1元兑换价值500元欧拉开发者认证代金券! (代金券平台仅限华为云实名认证用户领取一次,之前已在其他活动领取过的用户无法领取。)四、活动奖励奖项任务项奖项说明奖励数量学习有奖openEuler基础掌握完成其中一项任务项的任意一门课程,截图100%进度进行打卡即可申请开发者认证代金券完成任意一节课程或沙箱,即可申请领取499元欧拉开发者认证代金券/openEuler命令使用云上切换操作系统建议有奖云声平台成功发表产品使用体验或建议在云声平台发表Huawei Cloud EulerOS使用体验或建议,平台审核通过后可获得反馈礼品开发者定制棒球帽,开发者定制飞盘,游戏机礼盒等随机获取20注意事项:1、活动方根据打卡记录进行审核发券,本次活动参与用户需真实有效,如有虚假、黑产等行为,一律通报、剔除活动参与资格。
-
OpenEuler与其他操作系统(如Ubuntu、CentOS、Windows、macOS等)在多个方面存在显著差异。面向的市场:OpenEuler是一个主要面向企业级市场的开源操作系统。它专注于为云计算、大数据、人工智能等场景提供高性能、高可靠、易管理的解决方案。 相比之下,Ubuntu和CentOS等Linux发行版虽然也广泛应用于企业环境,但它们的定位更加广泛,涵盖了从个人桌面到服务器的多种应用场景。 Windows和macOS则主要面向个人用户和中小企业市场,提供了丰富的图形界面和应用程序生态。 开源性质:OpenEuler是一个完全开源的操作系统,遵循开放源代码许可协议。这意味着用户可以自由地获取、使用、修改和分发其源代码。 Ubuntu、CentOS等Linux发行版也同样是开源的,但它们的开源策略和社区支持可能有所不同。 而Windows和macOS则是闭源的操作系统,用户无法直接访问或修改其源代码。 稳定性和安全性:OpenEuler针对企业级应用进行了特别的优化,注重系统的稳定性和安全性。它提供了严格的安全更新策略和漏洞修复机制,以确保用户数据的安全。 其他Linux发行版也在稳定性和安全性方面表现出色,但OpenEuler可能更加专注于企业级市场的特定需求。 Windows和macOS在安全性和稳定性方面也有良好的表现,但它们的实现方式和更新策略可能与OpenEuler有所不同。 技术架构和特性:OpenEuler基于Linux内核构建,并集成了大量的企业级特性和工具。它支持多种虚拟化技术、容器化技术和云原生应用,以满足不同场景下的需求。 其他操作系统也有各自独特的技术架构和特性,如Windows的GUI界面和丰富的应用程序生态,macOS的Unix底层和优美的用户界面等。 总的来说,OpenEuler与其他操作系统在面向的市场、开源性质、稳定性和安全性等方面存在显著差异。这些差异使得OpenEuler成为企业级市场中的一个独特选择。
-
1. 环境: OS: openeuler 20.03 LTS DB: opengauss 5.0.0 lts 服务器:物理pc2. 问题复现过程: 2.1 安装opengauss 5.0.0 lts,断电前数据库状态正常,可登录,可查询; 2.2 长按power键断电,重新接电启动系统,执行gs_om命令查询数据库状态即报错: 2.3 再执行启动/重启命令时报错: 2.4 直接把StartInstance.py命令copy出来执行,报错: 2.5 于是查询下hostname和clusterconfig.xml文件:但是尝试了修改hostname和xml文件后重启,仍然没有成功。补充: 1. 仅长按power键关机复现,直接拔电源线不复现。 2. 用gs_ctl命令可以重启,但gs_om命令执行就报错。
-
openEuler安装软件的三种方式:rpm,yum和dnf安装的区别以及优缺点?
-
安装过程中出现下列现象: Starting udev Kernel Device Manager... Started udev Kernel Device Manager. watchdog: BUG: soft lockup - CPU#0 stuck for 22s! [modprobe 1395] watchdog: BUG: soft lockup - CPU#1 stuck for 22s! [systemd-udevd:1377] watchdog: BUG: soft lockup - CPU#2 stuck for 22s! [systemd-udevd:1305] watchdog: BUG: soft lockup - CPU#2 stuck for 21s! [systemd-udevd:1305] watchdog: BUG: soft lockup - CPU#2 stuck for 21s! [systemd-udevd:1305]....有遇到过吗?
-
srs 源代码在openEuler 22.03-lts-sp3 的x86和aarch64版本下编译,都没有报错,但一个能正常运行,一个不能运行,问题再哪里? wget https://github.com/ossrs/srs/archive/refs/tags/v5.0-r2.zip unzip v5.0-r2.zip cd srs-5.0-r2/trunk/ ./configure make make install x86下正常运行: /usr/local/srs/objs/srs -v 5.0.210 aarch64下则报错: [root@b5d6e7293ab6 ~]# /usr/local/srs/objs/srs -v [2024-04-16 16:47:13.679][ERROR][85434][][1] Failed, code=1014(StInitialize)(Initialize ST failed) : thread init : initialize st failed : st initialize failed, r0=-1 thread [85434][]: do_main() [./src/main/srs_main_server.cpp:114][errno=1] thread [85434][]: setup_thread_locals() [./src/app/srs_app_threads.cpp:562][errno=1] thread [85434][]: srs_st_init() [./src/protocol/srs_protocol_st.cpp:69][errno=1](Operation not permitted) [root@b5d6e7293ab6 ~]# 求助解决思路,谢谢
-
EulerOS 的iso镜像在哪里下载,华为镜像站只有软件包的提供,没有iso镜像的下载
-
说明 TaiShan 200系列服务器从V159版本BIOS开始支持SPE功能。检查BIOS配置项 MISC Config--> SPE的状态,如果状态为Disabled需要更改为Enabled。使用SSH远程登录工具,以root用户登录Linux操作系统命令行界面。 配置系统启动参数。 执行如下命令编辑配置文件。 vim /etc/grub2-efi.cfg定位到内核版本对应的开机启动项,在末尾增加“kpti=off”。 linux /vmlinuz-4.19.90-2003.4.0.0036.oe1.aarch64 root=/dev/mapper/openeuler-root ro rd.lvm.lv=openeuler/root rd.lvm.lv=openeuler/swap video=VGA-1:640x480-32@60me rhgb quiet smmu.bypassdev=0x1000:0x17 smmu.bypassdev=0x1000:0x15 crashkernel=1024M,high video=efifb:off video=VGA-1:640x480-32@60me kpti=off须知由于设置“kpti=off”后,系统安全性降低,禁止在生产环境上运行。按“ESC”,输入“:wq”,按“Enter”保存并退出。 执行reboot命令重启服务器。 安装鲲鹏性能分析工具后,执行如下命令确认SPE是否开启成功。 perf list | grep arm_spe显示如下内容说明SPE已成功开启。arm_spe_0// [Kernel PMU event] (适用于CentOS 7.6)配置SPE环境说明TaiShan 200系列服务器从V159版本BIOS开始支持SPE功能。 若要执行访存分析中的Miss事件分析,需先编译perf,便于支持SPE采集。 检查BIOS配置项 MISC Config--> SPE的状态,如果为Disable需要更改为Enable状态。使用SSH远程登录工具,以系统用户root登录Linux操作系统命令行界面。 配置系统启动参数。 执行如下命令编辑配置文件。 vim /boot/efi/EFI/centos/grub.cfg定位到内核版本对应的开机启动项,在末尾增加“kpti=off”。 linux /vmlinuz-4.14.0-115.el7a.0.1.aarch64 root=/dev/mapper/centos-root ro crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=en_US.UTF-8 kpti=off须知由于设置“kpti=off”后,系统安全性降低,禁止在生产环境上运行。按“ESC”,输入“:wq”,按“Enter”保存并退出。 执行reboot命令重启服务器。 执行如下命令获取内核启动参数,确认是否添加成功。 cat /proc/cmdline安装鲲鹏性能分析工具后,执行如下命令确认SPE是否开启成功。 perf list | grep arm_spe显示如下内容说明SPE已成功开启。arm_spe_0// [Kernel PMU event] 驱动安装 CentOS 7.6的Miss采集时,支持以下7个内核版本,内核驱动编译时请使用支持的版本。表1 支持内核版本操作系统内核版本CentOS 7.64.14.0-115.el7a.0.14.14.0-115.2.2.el7a4.14.0-115.5.1.el7a4.14.0-115.6.1.el7a4.14.0-115.7.1.el7a4.14.0-115.8.2.el7a4.14.0-115.10.1.el7a下载内核驱动至/home/spe_ko目录。将下载包中的devkitdriver-main/SPEdriver目录下的文件拷贝至/home/spe_ko目录下,以4.14.0-115.el7a.0.1版本为例,其他小版本需要先下载对应内核版本的rpm包,并将系统升级到该内核版本。编译驱动。 cd /home/spe_ko/arm_spe_pmumakecd /home/spe_ko/spe_devicemake查看驱动文件。 ls -l /home/spe_ko/arm_spe_pmu/arm_spe_pmu.kols -l /home/spe_ko/arm_spe_pmu/spe_device.koko文件安装。 insmod /home/spe_ko/arm_spe_pmu/arm_spe_pmu.koinsmod /home/spe_ko/arm_spe_pmu/spe_device.ko编译perf 下载内核源码到/home/spe_perf/kernel-alt-4.14.0-115.el7a.0.1目录。 检查flex和bison依赖包。 rpm -qa |grep bisonrpm -qa |grep flex如果没有相关依赖,则进行安装。yum install flexyum install bison解压rpm包。 cd /home/spe_perf/kernel-alt-4.14.0-115.el7a.0.1rpm2cpio kernel-alt-4.14.0-115.el7a.0.1.src.rpm | cpio -divmxz -d linux-4.14.0-115.el7a.tar.xztar -xvf linux-4.14.0-115.el7a.tar -C ..合入补丁。图3 下载页面将下载包中的perfpatch目录下的文件拷贝至/home/spe_perf目录下。cd /home/spe_perfchmod +x build_perf.sh./build_perf.sh查询arm_spe事件。 新生成的perf在“/home/spe_perf/linux-4.14.0-115.el7a/tools/perf”路径下,在perf路径执行perf list。cd /home/spe_perf/linux-4.14.0-115.el7a/tools/perf./perf list | grep arm_spe复制编译后的perf并修改权限。 mkdir -p /usr/bin/malluma/spe/4.14.0-115.el7a.0.1cp perf /usr/bin/malluma/spe/4.14.0-115.el7a.0.1chmod -R 500 /usr/bin/malluma/spe 转自:cid:link_0
-
NginxNginx 是什么Nginx(读作engine x)是一个轻量级开源Web服务器软件,由俄罗斯人Igor Sysoev在Rambler.ru任职期间开发,最初是为了解决高性能和可扩展性的问题而设计的。Nginx的历史可以追溯到2002年8月6日,当时Igor Sysoev发布了第一个公开版本0.1.0。在Nginx出现之前,Apache是最流行的Web服务器软件之一,但它的问题在于处理高并发连接时的性能瓶颈。Nginx采用了一种不同的设计思路,使用了异步事件驱动的方式处理请求,使得它能够更好地应对高并发场景。Nginx的发展得到了广泛的关注和支持。从nginx-0.5.x版本开始,它开始受到国内互联网人士的关注,并在国内得到了广泛的应用和推广。随着Nginx的不断发展和完善,它逐渐被应用于更多的场景,如反向代理、负载均衡、缓存等。在2011年,阿里巴巴旗下的淘宝网技术团队开源了一个基于Nginx的变种,名为Tengine。Tengine在Nginx的基础上增加了一些新的功能和优化,以满足淘宝等高并发场景的需求。随着时间的推移,Nginx逐渐成为了Web服务器市场的重要力量。根据2020年3月的数据,Nginx在全球Web服务器市场的占有率超过了老牌Web服务器Apache,成为了市场份额最大的Web服务器软件之一。Nginx之所以受到广泛的欢迎和应用,主要是因为它具有高性能、稳定性好、结构模块化、配置简单以及资源消耗低等优点。此外,Nginx还提供了丰富的功能和扩展,如SSL、GZIP、虚拟主机、URL重写等,可以满足各种Web应用的需求。总之,Nginx的历史可以追溯到2002年,经过十多年的发展和完善,它已经成为了Web服务器市场的重要力量,并在高并发场景下发挥着重要的作用。网络架构模式B/S 架构B/S即“Browser/Server”,是“浏览器/服务器”模式。在这种模式中,客户是浏览器,服务器是Web服务器。客户向服务器发出信息浏览请求,服务器向客户送回客户所要的万维网文档,以页面的形式显示在客户的屏幕上。B/S模式的一个重要特点是平台无关性,Browser、Web Server及主流语言Java和HTML等都可以做到与软硬件平台无关。另外,B/S模式的客户端变瘦,其功能主要是一个多媒体浏览器。C/S 架构C/S即“Client/Server”,是“客户端/服务器”模式。在这种模式中,客户(Client)和服务器(Server)分别是两个应用进程,可以位于互联网的两台不同主机上。服务器被动地等待服务请求,客户向服务器主动发出服务请求,服务器做出响应,并返回服务结果给客户。C/S模式中的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。技术架构收费技术栈:redhad + jqurey + js + svn + oracle + tomcat+java + apache省钱,走向开源技术栈:centos + jquery + js + git + mysql + java+tomcat + python+perl + nginx其他web服务器除了Nginx之外,还有一些其他常用的Web服务器软件,包括但不限于:Apache:Apache是最流行的Web服务器之一,具有跨平台、高可靠性、高性能、模块化设计、开源等优势。它支持几乎所有的Unix、Windows、Linux系统平台,尤其对Linux的支持相当完美。IIS(Internet Information Services):IIS是微软公司开发的Web服务器,具有良好的Windows系统集成性、易于管理、可靠性高等优势。它适用于Windows系统,可用于监视配置和控制Internet服务。Tomcat:Tomcat是一个开放源代码、运行servlet和JSP Web应用软件、并基于Java的Web应用软件容器。它具有跨平台、开源、易于扩展等优势,适用于Java应用程序的Web服务器。Lighttpd:Lighttpd是由德国人Jan Kneschke领导开发的,基于BSD许可的开源Web服务器软件。它的根本目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的Web服务器环境。除此之外,还有其他的Web服务器软件,如 Kangle、Tengin 等。这些服务器软件各有特点和优势,可以根据具体的需求和应用场景选择合适的 Web 服务器来提高Web应用的性能和可靠性。Nginx特点成本低nginx 强大在于其方向代理的功能,软件负载均衡,还存在硬件负载均衡(f5,netscaler),但是由于价格昂贵,小型公司不会使用,利用 nginx 搭建高可用性的负载均衡的站点由于 nginx 支持 BSD 开源许可协议,BSD 就是可以给用户更自己的使用权限,可以自由试用,修改源码,如果你修改后发布,还得遵顼 BSD 协议。利用软件技术,可以实现硬件负载均衡一样的实惠,经济实惠。几大优势nginx 配置文件更加易懂nginx 支持网站 url 地址重写(网站更换域名),还能够根据 url 的特点,进行请求转发判断(7层负载均衡,比如判断来自于移动端请求,发给移动端服务器,判断是来自于PC端流量,用户请求就发给运行着PC端代码的服务器)。nginx 支持高可用性配置(防止单节点故障,服务器崩溃),nginx 非常稳定,宕机异常退出的几率很小。nginx 能够节省忘了带宽,支持静态文件压缩后传输,支持 gzip 压缩功能。nginx 还能热部署,可以在不停止 nginx 情况下更新代码(reload),并且 nginx 支持 7*24h 运转。网络模型网络 IO 模型概念常见的 io 模型有:阻塞模型非阻塞模型IO 多路复用异步 IO网络 IO 指的就是在网络中进行数据的读,写操作,本质上就是一个 socket 套接字读取,socket 套接字在 linux 系统中被抽象为流的概念,网络 IO 就是对数据流的处理。安装nginx 提供商业版和开源版,且都支持 windows 和 linux 平台。商业版:https://nginx.com开源版:https://nginx.org环境准备准备 Nginx 需要的一些第三方系统库的支持,安装编译工具检查防火墙是否关闭,selinux关闭,yum 仓库的配置,网络环境等等。# 配置 aliyun yum 源 cd /etc/yum.repos.d/ mkdir bak mv * bak # 安装 centos 7 阿里的 yum 源,不同的版本可以安装不同的源 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 安装 epel 源 curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo # 清除之前的缓存 yum clean all # 缓存 aliyun 的 yum 源,加速下载 yum makecache # 安装常用的软件包 yum install -y vim bash-completion wget net-tools lrzsz # 安装如下的编译工具 yum install -y gcc gcc-c++ autoconf automake make # 安装 nginx 所需要的第三方系统库 yum install -y zlib zlib-devel openssl openssl-devel pcre pcre-devel httpd-tools # 关闭防火墙 systemctl disable --now firewalld setenforce 0编译安装 nginx# 1.下载 nignx 源代码 wget https://nginx.org/download/nginx-1.25.4.tar.gz # 或者下载 tengine wget https://tengine.taobao.org/download/tengine-3.1.0.tar.gz # 2.压缩 nginx tar -zxvf nginx-1.25.4.tar.gz -C /opt/ cd /opt/nginx-1.25.4/ [root@nginx-server nginx-1.25.4]# ll total 824 drwxr-xr-x. 6 502 games 4096 Mar 6 14:57 auto # 检测系统模块依赖信息 -rw-r--r--. 1 502 games 326027 Feb 15 00:03 CHANGES # 存放 nginx 的变化记录日志 -rw-r--r--. 1 502 games 498741 Feb 15 00:03 CHANGES.ru drwxr-xr-x. 2 502 games 168 Mar 6 14:57 conf # 存放 nginx 主配置文件的目录 -rwxr-xr-x. 1 502 games 2611 Feb 15 00:03 configure # 可执行的脚步,用于释放编译文件的定制脚步 drwxr-xr-x. 4 502 games 72 Mar 6 14:57 contrib # 提供了 vim 插件,让配置文件颜色区分 drwxr-xr-x. 2 502 games 40 Mar 6 14:57 html # 存放了标准的 html 页面文件 -rw-r--r--. 1 502 games 1397 Feb 15 00:03 LICENSE drwxr-xr-x. 2 502 games 21 Mar 6 14:57 man -rw-r--r--. 1 502 games 49 Feb 15 00:03 README drwxr-xr-x. 9 502 games 91 Feb 15 00:03 src # 存放了 nginx 源代码的目录 # 3.拷贝 nginx 的配置文件语法高亮,发给 vim 的插件目录 [root@nginx-server ~]# mkdir ~/.vim [root@nginx-server ~]# cp -r /opt/nginx-1.25.4/contrib/vim/* ~/.vim # 4.开始编译安装三部曲 # 1>: ./configure --prefix=/opt/nginx --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-threads --with-file-aio # 2>: make(如同开始下一步安装) # 3>: make install(如同点击开始安装) # 5.配置 nginx 环境变量 [root@nginx-server ~]# vim /etc/profile.d/nginx.sh export PATH="$PATH:/opt/nginx/sbin" [root@nginx-server ~]# source /etc/profile.d/nginx.sh [root@nginx-server ~]# nginx -V nginx version: nginx/1.25.4 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017 TLS SNI support enabled configure arguments: --prefix=/opt/nginx --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-threads --with-file-aio概念nginx 配置文件语法详解nginx.conf 是由指令和指令块组成每行语句都得有分号结束,指令和参数之间是有空格分割的指令块可以由大括号{}组织多语句nginx.conf 使用 # 号表示注释符nginx 支持用 $ 变量名支持该语法nginx 支持 include 语句,组合多个配置文件nginx 部分指令支持正则表达式,如 rewrite 重写指令nginx 核心功能都在 http{}指令块中,http{}中还包含了以下指令server{},对应一个站点配置,反向代理,静态资源location{},对应一个 urlupstream{},定义上流服务,负载均衡池########## 全局指令 #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; ########## 局部指令 events { worker_connections 1024; } ########## http{}语句快,核心功能配置 http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; ########## 此处是 server{}语句块,是在 http{}语句块里的 server { listen 80; server_name localhost; location / { root html; index index.html index.htm; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }Nginx 信号传递nginx 的工作原理master 主进程是不处理请求的,而是分配请求发给 worker 进程,主进程负责重启,热加载,热部署等信号。master 是根据 nginx.conf 中 worker_process 定义启动时创建的工作进程数。当 worker 运行后,master 就处于一个等待的状态,等待用户的请求来临,或者系统信号。系统管理员可以发送 kill 指令,或者 nginx -s 信号,这样的形式操控 nginx。nginx 信号集nginx -s 常用的信号集功能如下:参数信号含义stopTERM强制关闭 nginx 服务nullINT强制关闭整个 nginx 服务quitQUIT优雅关闭整个 nginx 服务reopenUSR1重新打开日志记录reloadHUB重新读取配置文件,并且优雅的退出旧的 worker功能实践Nginx 命令行1.nginx #启停指令,-s 参数,值得是给 nginx 进程发送某种信号 nginx # 启动 nginx -s stop # 停止 nginx -s reload # 平滑重启,不重启进程,重载配置文件 2.查看nginx命令的帮助信息 [root@nginx-server conf]# nginx -h nginx version: nginx/1.25.4 Usage: nginx [-?hvVtTq] [-s signal] [-p prefix] [-e filename] [-c filename] [-g directives] Options: -?,-h : this help # 显示 nginx 的帮助信息 -v : show version and exit # 显示版本 -V : show version and configure options then exit # 显示版本和编译参数信息 -t : test configuration and exit # 检测 nginx 语法是否正确 -T : test configuration, dump it and exit # 检查配置,并输出配置信息 -q : suppress non-error messages during configuration testing # 在检测配置文件期间屏蔽非错误信息 -s signal : send signal to a master process: stop, quit, reopen, reload # 给 nginx 主进程发生一个信号,stop,停止运行,quit,优雅停止,reopen,重启记录nginx日志,reload,重读配置文件 -p prefix : set prefix path (default: /opt/nginx/) # 设置 nginx 目录前缀 -e filename : set error log file (default: logs/error.log) # 设置错误文件的路径 -c filename : set configuration file (default: conf/nginx.conf) # 设置主文件的路径 nginx -c /my/nginx.conf -g directives : set global directives out of configuration file # 从配置文件中设置全局指令nginx 热部署(未成功)热部署大致流程备份旧的程序(二进制文件,nginx 命令,/opt/nginx/sbin/nginx)编译安装新的二进制文件,覆盖旧的二进制文件(再装一个版本的ngin,且替换旧的nginx命令)发送 USR2 信号给旧的 master 进程发送 WINCH 信号给旧的 master 进程发送 QUIT 信号给旧的 master 进程、示例:# 1.备份 [root@nginx-server ~]# cp /opt/nginx/sbin/nginx /opt/nginx/sbin/nginx-1.25.4 # 2.安装不同版本的 nginx [root@nginx-server ~]# wget https://nginx.org/download/nginx-1.24.0.tar.gz # 压缩 [root@nginx-server ~]# tar -zxvf nginx-1.24.0.tar.gz -C /opt/ # 编译安装三部曲 [root@nginx-server ~]# cd /opt/nginx-1.24.0/ ./configure --prefix=/opt/nginx --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module --with-threads --with-file-aio [root@nginx-server nginx-1.24.0]# make && make install # 3.姿势发送一个 USR2 信号给旧的 master process,作用是使得 nginx 旧的版本停止接受用户请求,并且切换为新的 nginx 版本。 [root@nginx-server sbin]# kill -USR2 `cat /opt/nginx/logs/nginx.pid ` # 4.发送WINCH信号 kill -WINCH ` cat /var/nginx_1.17/logs/nginx.pid.oldbin `Ngingx 日志切割日志切割是线上很常见的操作,能够控制单个日志文件的大小,便于对日志进行管理。# 1.针对 nginx 的访客日志进行切割 [root@nginx-server logs]# du -h * 4.0K access.log 4.0K error.log 4.0K nginx.pid # 2.以当前时间为文件名进行备份 [root@nginx-server logs]# mv access.log "access.log_$(date +"%Y-%m-%d")" # 3.发信号给 nginx 主进程,给他发送一个重新打开的信号,让 nginx 重新生成新的日志 nginx -s reopen # 等同于 kill -USR1 process id注意在以上的 nginx 重命名日志切割链,不要着急立即对文件修改,而是需要等待几秒钟,可能当业务量访问过大时,这个修改操作可能会有点急,不会立即生效。在生产环境下,日志切割主要时以定时任务的形式来操作编写一个定时日志切割的脚步vim cut_nginx_log.sh#!/bin/bash # nginx 日志存放点 logs_path="/opt/nginx/logs/" mkdir -p ${logs_path}$(date -d "yesterday" +"%Y")/$(date -d "yesterday" + "%m") mv ${logs_path}access.log ${logs_path}$(date -d "yesterday" + "%Y")/$(date -d "yesterday" + "%m")/access_$(date -d "yesterday" + "%Y-%m-%d").log kill -USR1 `cat /opt/nginx/logs/nginx.pid`指定定日任务如下:每天的 0 点执行日志切割脚本。crontab -e 0 0 * * * /bin/bash /root/cut_nginx_log.shNginx 虚拟主机Nginx虚拟主机是一种特殊的互联网服务,它利用特殊的软硬件技术将一台运行在因特网上的服务器主机分成多个“虚拟”的主机。每台虚拟主机都可以作为一个独立的网站,拥有独立的域名,并具备完整的Internet服务器功能,如WWW、FTP、Email等。对于网站访问者来说,每一台虚拟主机就像是一台主机。小技巧:在编辑 nginx.conf 中的配置文件时,将光标移动到{/}(任意一个花括号的位置,比如,在 { 位置,按下 % 就可以跳到与之对应的另一半挂括号的位置了。注意:nginx.conf 中 server{} 虚拟主机标签的定义,默认加载顺序时自伤而下的匹配规则。静态站点vim /opt/nginx/conf/nginx.conf # 站点配置块 server{} server { # 定义监听端口 listen 80; # 定义虚拟主机的域名配置,没有域名就可以写 localhost 或者 _ 也行 server_name localhost; # 给 nginx 定义网站的编码 charset utf-8; # 日志,现在不用,可以不用管 #access_log logs/host.access.log main; # nginx 的路径匹配规则 # 如下的规则时最低级匹配,任何的 nginx 请求,都会进入如下 location 的匹配,去它所定义的目录中寻找资料 location / { # root 关键词,时定义网页根目录的,这个 html 时以 nginx 安装的路径为相对 root /www/root/; # index 关键词,定义 nginx 的有也文件名字,默认找哪个文件 index index.html index.htm; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } # 创建网页站点根目录 mkdir -p /www/root echo "hello world!" > /www/root/index.html基于 IP 的多虚拟主机1.添加 ip[root@nginx-server conf.d]# ip ad add 192.168.113.101/24 dev ens33 [root@nginx-server conf.d]# ip ad add 192.168.113.102/24 dev ens33 [root@nginx-server conf.d]# ip ad add 192.168.113.103/24 dev ens332.添加配置到 nginx.confserver { listen 192.168.113.101:80; server_name localhost; location / { root /www/server1/; index index.html index.htm; } } server { listen 192.168.113.102:80; server_name localhost; location / { root /www/server2/; index index.html index.htm; } } server { listen 192.168.113.103:80; server_name localhost; location / { root /www/server3/; index index.html index.htm; } }3.设置站点文件mkdir /www/server{1..3} for i in `ls /www/ | grep server` ;do echo this is the $i > /www/$i/index.html ;done4.重载配置文件nginx -s reload5.测试网站[root@nginx-server nginx]# curl 192.168.113.101 this is the server1 [root@nginx-server nginx]# curl 192.168.113.102 this is the server2 [root@nginx-server nginx]# curl 192.168.113.103 this is the server3基于多域名的虚拟主机基于多域名的虚拟主机,用的还是不多的,还可能造成 ip 不足等问题,一般如果没有特殊需求,用的更多,且更方便的是基于多域名的虚拟主机。/etc/hosts 设置域名,进行本地测试使用[root@nginx-server ~]# vim /etc/hosts # 追加 192.168.113.31 server1.com 192.168.113.31 server2.com 192.168.113.31 server3.com修改配置# 还是拿之前那个基于 ip 的配置改 server { listen 80; server_name server1.com; location / { root /www/server1/; index index.html index.htm; } } server { listen 80; server_name server2.com; location / { root /www/server2/; index index.html index.htm; } } server { listen 80; server_name server3.com; location / { root /www/server3/; index index.html index.htm; } }设置站点文件# 还是拿之前那个基于 ip 的站点文件 index.html重载服务nginx -s reload测试网站[root@nginx-server conf.d]# curl server1.com this is the server1 [root@nginx-server conf.d]# curl server2.com this is the server2 [root@nginx-server conf.d]# curl server3.com this is the server3基于多端口的虚拟主机只需要修改 nginx.conf 中 server{}块里定义的 listen 端口参数即可,实验不同的端口,进行虚拟主机匹配修改配置# 还是拿之前那个基于 ip 的配置改 server { listen 81; location / { root /www/server1/; index index.html index.htm; } } server { listen 82; location / { root /www/server2/; index index.html index.htm; } } server { listen 83; location / { root /www/server3/; index index.html index.htm; } }设置站点文件# 还是拿之前那个基于 ip 的站点文件 index.html重载服务nginx -s reload测试网站[root@nginx-server conf.d]# curl localhost:81 this is the server1 [root@nginx-server conf.d]# curl localhost:82 this is the server2 [root@nginx-server conf.d]# curl localhost:83 this is the server3Nginx 静态资源压缩nginx 支持 gzip 压缩功能,经过 gzip 压缩之后的页面,图片,动态图这类的静态文件,能够压缩为原本的 30% 甚至更小,用户访问网络的体验会更好。启动 gzip 压缩功能,只需要在 http{} 配置中,打开如下参数即可:http { ... gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_proxied any; gzip_comp_level 6; gzip_vary on; gzip_min_length 1000; gzip_buffers 16 8k; ... }这里的配置项解释如下:gzip on;:启用 Gzip 压缩。gzip_types:定义哪些 MIME 类型的响应体将被 Gzip 压缩。你可以根据需要添加或删除类型。gzip_proxied any;:允许或者禁止压缩基于请求和响应的代理请求。gzip_comp_level 6;:设置压缩级别,范围从 1(最低压缩,最快处理速度)到 9(最高压缩,最慢处理速度)。gzip_vary on;:在响应头中添加 "Vary: Accept-Encoding" 以告知客户端内容经过了压缩。gzip_min_length 1000;:设置启用压缩的响应体最小长度(单位:字节)。小于这个长度的响应体将不会被压缩。gzip_buffers 16 8k;:设置压缩缓冲区大小和数量。日志功能日志对于程序员是很重要的,可以用于问题排错,记录程序运行时的状态。访客(access)日志Nginx 开启日志功能只需要再 nginx.conf 中找到 log_format 参数,定义日志的格式,以及定义日志的存储位置。http { .... # 定义日志的内容格式(记录内容的详细程度) log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log logs/access.log main; .... }nginx 的访客日志内容如下192.168.113.31 - - [08/Mar/2024:10:41:11 +0800] "GET / HTTP/1.1" 200 20 "-" "curl/7.29.0" # 定义格式如下 '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' $remote_addr # 记录访问者的 ip $remote_user # 记录访问者的用户名 $time_local # 记录访问的时间和地区信息 $request # 记录用户的 http 请求的首行信息 $status # 记录用户的 http 请求状态,也就是请求发出之后,响应的状态,200,301,404,502 $body_bytes_sent # 记录服务器发给客户端的响应数据字节大小 $http_referer # 记录本次请求时从哪个链接过来的,可以根据 refer 信息来进行防盗链 $http_user_agent # 记录客户端的访问信息,如浏览器信息,手机信息 $http_x_forwarded_for # 防止恶意爬虫,跳板机等,并捉到代理服务器后面的客户端ip错误(error)日志对于错误信息的调试,也是运维人员维护 nginx 的一个重要的手段。nginx 想要使用 error_log 就得打开 nginx.conf,找到关键字参数 error_log,它是放在 http{}称之为全局的变量参数,针对所有定义的 server{}的虚拟主机都会生效。#error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info;也可以单独的在写在虚拟主机中,单独记录某一个虚拟主机的错误日志。 server { listen 80; server_name localhost; charset utf-8; # 单独定义一个虚拟主机的错误日志 error_log logs/s1_error.log #access_log logs/host.access.log main; location / { root /www/root/; index index.html index.htm; } .... }错误日志的语法error_log file level; 日志级别有如下几种 debug info notice warn error crit alert emerg 这个级别是越来越严重,级别写的越低,记录的日志越详细,圣餐环境下常用的是 warn,error,crit 模式,日志的级别,可能会给服务器增加额外的大量 IO 消耗,因此,根据你实际的工作环境需求。Nginx 多虚拟主机日志针对每一个虚拟主机都配置好 access.log 更方便更清晰的对每一个虚拟主机进行访客信息管理。# 针对虚拟主机,添加日志的路径 server { listen 81; # 在每一个虚拟主机都添加 access_log 参数,就可以对每一个虚拟主机有不同的日志文件 access_log logs/server1_81.log; location / { root /www/server1/; index index.html index.htm; } }目录浏览能够将你的机器上目录资料,提供一个展示,无论是谁都可以快速访问,类似于 FTP 服务。配置文件如下,在server{}块中添加:server { listen 81; access_log logs/server1_81.log; location / { root /www/server1/; # root 目录里,不能存在 index.html 文件,因为浏览器默认访问的是 baidu.com/index.html #index index.html index.htm; # 关闭虚拟主机的默认首页功能 autoindex on; # 启动目录浏览功能 } }状态页功能nginx 提供了 status 模块,用于检测 nginx 的请求链接信息。这个功能需要再编译安装 nginx 的时候,添加 --with-http-status_module 参数,才能使用。nginx -V # 检查当前 nginx 是否支持 status 功能修改 nginx.conf,支持此功能,内容如下:# 1.确保你的 nginx.conf 主配置文件,支持 include 语法 include ../conf.d/*.conf; # 当当前的上一级目录 conf.d 目录下的所有 conf 文件,都识别成 nginx 的配置文件。 # 2.创建 status.conf vim /opt/nginx/conf.d/status.conf # 写入如下内容 server{ listen 88; location / { stub_status on; # 开启状态页功能 access_log off; # 关闭访客日志功能 } }状态页内容分析# 表示激活中的连接数 Active connections: 1 # server: nginx 启动后一共处理的请求数 # accepts handled: nginx 启动后处理的握手数 # requests: 表示 nginx 一共处理了多少次的请求 server accepts handled requests 96 96 912 # Reading: nginx 读取到客户端的 headers 数量 # Writing:nginx 响应给客户端的 headers 数量 # Waiting:nginx 处理完毕请求之后,等待下一次的请求驻留的连接数 waiting=actve-() Reading: 0 Writing: 1 Waiting: 0 使用 ab 命令,对 nginx 进行压力测试# 1.安装 ab 命令 yum install -y httpd-tools # 2.使用 ab 命令对 nginx 发送大量的连接 -n # 请求数量,一共发出多少个请求 -c # 请求并发数 -k # 表示启动 keepalived 保持连接功能 [root@nginx-server ~]# ab -kc 1000 -n 100000 http://127.0.0.1/location 路径匹配nginx 的 location 作用,是根据用户访问的 URL 路径,进行不同的处理方式,针对用户请求的网站 URL 进行匹配处理# location 在 nginx.conf 的写法 location / { # root 关键词,是定义网页根目录的,这个 html 是以 nginx 安装的路径作为匹配路径 root /www/root/; # index 关键词,定义 nginx 的首页文件名字 index index.html index.htm; }location 相关语法location [ = | ~ | ~* | / | ^~] url { # 做出的响应的处理动作 }匹配符号:匹配符匹配规则优先级=精确匹配1^~以某个字符开头,不做正则匹配2~*支持正则的匹配模式3/blog/当你访问 192.168.100.100/blog/xxx,nignx 就会把请求返回给这个 location4/通用匹配,不符合其他的 location 的匹配规则,返回这个 location5示例:server { listen 888; server_name _; # 最低级匹配,不符合其他 location 就来这 location / { return 500; } # 优先级最高,精确匹配,当用户访问 192.168.100.100:888/,请求就会到这来 location = / { return 401; } # 匹配任何以 /img/ 开头的请求,不支持正则 location ^~ /img/ { return 402; } # 匹配任何以 .gif 结尾的请求,支持正则 location ~* \.(gif|jpg|jpeg)$ { return 403; } # 以 /blog/ 开头的 URL,来这里,如符合其他 location,则以其他优先 location /blog/ { return 404; } }URL 地址重写Nginx 的 URL 地址重写功能,主要是使用 nginx 提供的 rewrite 功能,且支持正则表达式。rewrite 能够使用 URL 的跳转,实现 URL 规范化,根据请求的变量实现 URL 跳转等,基于 URl 重写功能常见的效果如下:对于爬虫程序的封禁,让其跳转都一个错误的页面。动态的 URL,伪装成静态的 html 页面,便于搜索引擎的抓取。新旧域名的更新。rewrite 语法rewrite ^/(.*) http://192.168.113.31/$1 parmanent; # 解释 rewrite # 是 nginx 地址重写的关键词指令,开启跳转功能。 正则 ^/(.*) # 表示匹配所有的请求,匹配成功后,跳转到后面指定的 rul 地址。 $1 # 是取出前面用户访问的 url 路径 parmanment # 表示 301 重定向的标记rewrite 结尾的参数标记如下:last:规则匹配完成后,继续向下匹配新的 location。break:本条规则匹配完成后,立即停止匹配动作。redirct:返回 302 临时重定向状态码,浏览器地址栏显示跳转后的 rul,爬虫不会更新该 url。permanent:返回 301 永久重定向,浏览器地址栏也显示跳转后的 rul ,爬虫会更新该网站 url。last 和 break 用于实现 url 重写,浏览器的地址栏不会发生变化。redirect 和 permanent 是用于 url 跳转,浏览器 url 地址栏会发生变化,跳转到新的 url 地址栏。示例,实现 301 url 跳转准备一个虚拟主机的配置文件,实现,当用于访问该虚拟主机,直接跳转到百度的首页面。server { listen 90; server_name _; location / { rewrite ^/(.*) http://www.baidu.com/$1 permanent; } }反向代理其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。反向代理在 nginx 中可以在 location{}块中来定义 proxy_pass 来实现反向代理。语法演示# 当客户端访问到 location,而 location 的动作就是将请求转发到 http://127.0.0.1:888 上。 location / { proxy_pass http://127.0.0.1:888; # 这种方式为四层代理 }示例实例1:实现效果:使用 Nginx 反向代理,访问 http://www.123.com 直接跳转到 127.0.0.1:82。注意:此处如果要想从 http://www.123.com 跳转到本机指定的ip,需要修改本机的hosts文件。此处略过配置代码server { listen 80; server_name www.123.com; location / { proxy_pass http://localhost:82; } }测试[root@nginx-server nginx]# curl www.123.com this is the server2示例实例2:实现效果:使用 Nginx 反向代理,根据访问的路径跳转到不同端口的服务中,Nginx 监听端口为 8080。配置代码server { listen 8080; server_name www.123.com; location / { root /www/server1/; autoindex on; } location /php/ { proxy_pass https://www.csdn.net/; } location /ws/ { proxy_pass http://www.baidu.com/; } }负载均衡Nginx要实现七层负载均衡需要用到proxy_pass代理模块配置。Nginx默认安装支持这个模块,我们不需要再做任何处理。Nginx的负载均衡是在Nginx的反向代理基础上把用户的请求根据指定的算法分发到一组【upstream虚拟服务池】。负载均衡的指令upstream 指令upstream:该指令是用来定义一组服务器,它们可以使监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器。服务器可以指定不同的权重,默认为1.# 语法 upstream name{...}server 指令server:该指令用来指定后端服务器的名称和一些参数,可以使用域名、IP、端口或者unix socket。# 语法 server name [parameters];常用负载均衡的三种模式:RR简单轮询(默认)RR(round-robin)轮询,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。示例upstream test { server localhost:8080; server localhost:8081; }balance权重又叫平滑的加权轮询(smooth weighted round-robin balancing),指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。示例upstream test { server localhost:8080 weight=2; server localhost:8081 weight=1; }ip_hash(可确保session一致)接下来是,基于IP哈希分配,上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,除非做session共享或者同步,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用ip_hash了,ip_hash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。示例upstream test { ip_hash; server localhost:8080; server localhost:8081; }示例实验目的:三个基于端口的虚拟主机,使用端口号 8080 负载均衡这三台主机。nginx 配置文件如下所示upstream backend{ server localhost:81; server localhost:83; server localhost:82; } server { listen 81; server_name _; location / { root /www/server1/; index index.html index.htm; } } server { listen 82; location / { root /www/server2/; index index.html index.htm; } } server { listen 83; location / { root /www/server3/; index index.html index.htm; } } server { listen 8080; server_name localhost; location / { proxy_pass http://backend/; } }缓存服务认证模块为了防止有点小网站不想让别人看到,nginx 就提供了可以在小网站上开启认证模块,别想看到哦我们的小网站,就需要账号密码,不然访问不了,让我们操作一下吧。nginx 提供了认证模块,语法是location { auth_basic 'string'; auth_basic_user_file conf/htpasswd; }语法知道了,现在需要生成一个密码文件,linux 提供了密码生成命令 htpasswd 是 apache 提供的密码生成工具,nginx 也支持 auth_basic 模块,因此我们可以利用 htpasswd 命令生成账户密码文件,提供给 nginx 去使用。# 安装命令 yum install -y httpd-tools # 语法 htpasswd -bc <filename> [username] [password] # 解释 -b # 在命令行中输入账号密码 -c # 创建密码文件默认 .access 文件采用加密方式 md5 加密。示例:# 生成密码文件 htpasswd -bc /opt/nginx/conf.d/.access ws 000000 # 配置文件编写如下 vim /opt/nginx/conf.d/learn_auth.conf server{ listen 85; server_name _; location / { root /opt/nginx/html/; index index.html index.htm; auth_basic 'learn nginx auth_module'; auth_basic_user_file /opt/nginx/conf.d/.access; } }动态请求分离HTTPS
-
iptables 防火墙iptables 是什么iptables 是一个用于配置 linux 内核中 IPv4 数据包过滤器和网络地址转换(NAT)的工具。它允许系统管理员根据特定的规则集控制进出的网络流量。iptables 提供了一种灵活而强大的方式来保护网络安全,实现网络地址转换,限制流量等。iptables 工作原理iptables 是基于 linux 内核中的 Netfilter 架构实现的。当数据包进入或离开系统时,Netfilter 框架会将数据包转递给 iptables 进行处理。它可以通过检查数据包的源地址,目标地址,协议类型,端口号等信息,并根据预定义的规则集来决定如何处理该数据包。iptables 的基本概念表(Table)表定义了特定类型的规则集。iptables 提供了四个表:filter、nat、mangle 和 raw。每个表用于不同的目的,如过滤数据包、网络地址转换等。链(Chain)链是规则的集合,用于确定数据包在系统中的处理路径,iptables 包含几个预定义的链,如 INPUT,OUTPUT 和 FORWARD。每个链都有特定的处理方式和默认策略。规则(Rule)规则则是定义在链中的指令,用于决定数据包的处理方式。规则由匹配条件和动作组成,当数据包满足条件时,将执行相应的动作。常见的 iptables 命令基本语法:use: iptabls [选项] <链名> <规则>匹配条件-A:追加到链上-p:指定数据包的协议类型,如 TCP、UDP、ICMP 等。-s:指定数据包的源地址。-d:指定数据包的目标地址。-i:指定数据包进入系统的网络接口。-o:指定数据包离开系统的网络接口。匹配选项--sport:指定数据包的源端口。--dport:指定数据包的目标端口。--state:指定数据包的连接状态,如 NEW、ESTABLISHED、RELATED 等。--mac-source:指定数据包的源 MAC 地址。--mac-destination:指定数据包的目标 MAC 地址。匹配动作-j:指定匹配成功时要执行的动作,如 ACCEPT、DROP、REJECT 等。示例演示使用 ip:192.168.113.13 的主机1 ping 本机2:192.168.113.11,我们创建两条规则。# 没创建规则前,如果要模拟,最好清理一下所有规则,iptables -F # 主机1 ping 主机2 [root@Euler03 ~]# ping 192.168.113.11 -c 2 PING 192.168.113.11 (192.168.113.11) 56(84) bytes of data. 64 bytes from 192.168.113.11: icmp_seq=1 ttl=64 time=0.176 ms 64 bytes from 192.168.113.11: icmp_seq=2 ttl=64 time=0.320 ms --- 192.168.113.11 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1024ms rtt min/avg/max/mdev = 0.176/0.248/0.320/0.072 ms # 设置第一条规则 iptables --table filter -A INPUT --source 192.168.113.13 -j REJECT # 主机1 ping 主机2 [root@Euler03 ~]# ping 192.168.113.11 -c 2 PING 192.168.113.11 (192.168.113.11) 56(84) bytes of data. From 192.168.113.11 icmp_seq=1 Destination Port Unreachable From 192.168.113.11 icmp_seq=2 Destination Port Unreachable 2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 30663ms # 设置第二条规则 iptables --table filter -A INPUT --source 192.168.113.13 -j DROP # 因为 iptables 规则执行顺序,要删除第一条规则 # 查看 iptables --table filter --list INPUT --line-numbers # 删除第一条规则,此时第二条规则会瞬移到第一条规则 iptables --table filter --delete INPUT 1 # 主机1 ping 主机2 [root@Euler03 ~]# ping 192.168.113.11 -c 2 PING 192.168.113.11 (192.168.113.11) 56(84) bytes of data. --- 192.168.113.11 ping statistics --- 2 packets transmitted, 0 received, 100% packet loss, time 1024ms注意:iptables 规则是从上往下读的,当规则1 和规则2 的源地址或目的地址一致,会优先执行规则 1。常见的 ipset 命令提供下载的国家IP块分配:www.ipdeny.com# 创建名称为test的IP集 ipset create test hash:ip # 添加地址合集到test IP集中 #! /bin/bash wget https://www.ipdeny.com/ipblocks/data/aggregated/in-aggregated.zone for i in `ls in-aggregated.zone` do ipset add test $i done if [ $? -eq 0 ] then echo "*****命令执行完成*****" else echo "*****命令执行失败*****" fi如果想使用 iptables 做规则,可以使用以下命令:iptables -t filter -A INPUT --match set --match-set test src -j ROP # 这样印度的 ip 就不能访问到你的电脑了,同时你的电脑也不能访问印度的 ip 了,因为数据包的发送时需要有接受的,虽然你请求了,但是你的电脑做了规则限制,你的电脑就接受不了这个请求包。iptables 保存配置因为 iptbales 和 ipset 重启电脑之后之前写的规则都会丢失,所有要保存重启前的规则。使用命令 iptables-save 和 ipset save 来保存规则ipset save > /etc/rulers.ipset iptables-save > /etc/ruler.iptables使用命令 iptables-restore 和 ipset restore 导入规则ipset restore < /etc/ruler.ipset iptables-restore < /etc/ruler.iptables
-
系统进程管理进程是什么?进程(process)就是已启动的可执行程序(program)的运行实例。进程组成部分已分配内存的地址空间;安全属性,包括所有权凭据和特权;程序代码的一个或多个执行线程;进程状态。程序:二进制文件,静态 /usr/bin/passwd,/usr/sbin/useradd。进程:是程序运行的过程,动态,有生命周期及运行状态。进程分类实时进程Typora 用户交互的进程,需要及时响应。普通进程响应不需要那么及时的进程,压缩文件,视频的编码解码。上下文切换上下文切换(context switch)又称环境切换,电脑术语,是一个存储和重建 CPU 的状态,因此令多个进程(process)可以分享单一 CPU 资源的计算过程。要切换 CPU 上的进程时,必须先行存储目前进程的状态,再将欲运行的进程之状态读回 CPU 中。Nice 值nice 值越高,cpu 调度优先级越低。nice 命令# 启动一个进程并设置 nice 值 [root@openeuler ~]# nice -n 11 bash [root@openeuler ~]# [root@openeuler ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 1068 1061 0 80 0 - 29070 do_wai pts/0 00:00:00 bash 4 S 0 4244 1068 0 91 11 - 29018 do_wai pts/0 00:00:00 bash 0 R 0 4257 4244 0 91 11 - 38331 - pts/0 00:00:00 ps [root@openeuler ~]# nice 11renice 命令# 使用命令 renice 修改进程的 nice 值 # 要将进程 ID 为 1234 的进程的优先级设置为 10,你可以使用以下命令 renice 10 -p 1234 # 如果要修改属于特定用户的所有进程的优先级,可以使用以下命令: renice 10 -u username # 查看进程优先级,查看 NI 一列的信息,显示的是进程的 nice 值 # NI: 进程的nice值。这是一个可以由用户调整的值,用于改变进程的优先级。一个正值的nice值将使进程优先级降低(运行更慢),而负值则使优先级提高(运行更快) ps -efl # 这个命令提供了比简单的 ps -ef 更详细的信息,包括进程ID(PID)、父进程ID(PPID)、用户ID(UID)、启动时间(STIME)、占用的CPU总时间(TIME)、终端类型(TTY)以及进程的启动命令(CMD)等。进程 fork 概念我们系统本身就是一堆进程,当系统运行时,就产生了 0 号进程,其他进程都是由 0 号进程所创建的子进程。linux 启动后,第一个进程就是 PID 为 0,通过 0 号进程 fork()出其他的进程。操作系统的运行,就是不断地创建进程,以及销毁进程。# 使用BSD语法查看系统上的每个进程,unix 操作系统下,查看进程,用如下不带短横线的参数选项 [root@openeuler ~]# ps auxf ... root 814 0.0 0.2 112900 4348 ? Ss Mar01 0:00 /usr/sbin/sshd -D root 1061 0.0 0.3 163568 6336 ? Ss Mar01 0:00 \_ sshd: root@pts/0 root 1068 0.0 0.1 116280 2948 pts/0 Ss Mar01 0:00 | \_ -bash root 4244 0.0 0.1 116204 2840 pts/0 SN 11:20 0:00 | \_ bash root 4694 0.0 0.0 155584 1936 pts/0 RN+ 15:15 0:00 | \_ ps -auxf root 1066 0.0 0.2 163264 6052 ? Ss Mar01 0:00 \_ sshd: root@notty root 1089 0.0 0.1 72252 2676 ? Ss Mar01 0:00 \_ /usr/libexec/openssh/sftp-server # 使用标准语法查看系统上的每个进程 [root@openeuler ~]# ps -ef | grep ssh root 814 1 0 Mar01 ? 00:00:00 /usr/sbin/sshd -D root 1061 814 0 Mar01 ? 00:00:00 sshd: root@pts/0 root 1066 814 0 Mar01 ? 00:00:00 sshd: root@notty root 1089 1066 0 Mar01 ? 00:00:00 /usr/libexec/openssh/sftp-server root 4728 4244 0 15:28 pts/0 00:00:00 grep --color=auto ssh小知识:当使用 ps 命令来查看进程名字,带有中括号的成为内核进程,是 linux 内核自动生成的进程,linux 所有的发行版都能看见,不带中括号,就是发行版系统生成的进程,用户来生成各种进程。进程产生执行流程:操作系统 0 号进程,0 号进程会创建出一堆内核级进程,提供操作系统运行。 ↓ linux 用户级别启动的 1 号进程 ↓ 创建子进程 sshd 进程 ↓ 用户 /bin/bash 进程 ↓ 用户执行其他命令进程孤儿进程程序运行时,生成了父亲进程,儿子进程。父亲进程突然挂了,儿子成了孤儿,被1号进程收养。儿子进程的诞生是为了执行程序,程序结束后,被 1 号进程释放,消失在了这个美丽的世界。僵尸进程僵尸进程明显比孤儿进程可怕,是有害的父进程创建出子进程后,如果子进程先挂了,父进程却不知道儿子进程挂了这件事,就无法正确送走儿子进程,没有处理它在系统中的信息,那么这个儿子进程就会变成可怕的僵尸进程,会对系统产生危害。当系统中有了僵尸进程,你可以通过 ps 命令找到它,并且它的状态是 Z(zombie)。如果系统中产生大量僵尸进程,占据了系统中大量可分配的资源,如果进程 id 号,系统就无法再正确创建新进程,完成任务,导致系统无法使用的危害。如何解决僵尸进程:1.可以主动杀死(kill)父亲进程 pid;2.如果程序会自动结束的话,比如 timesleep()时间到期。进程文件资源管理lsof(list open file)列出当前系统打开文件的工具。常用参数:-c:指定进程名称,打开了哪些系统文件-p:显示指定 pid 打开的文件-u:显示指定用户 uid 打开的文件,以及具体进程信息+d:显示文件夹下被打开的文件有哪些+D:递归列出目录下哪些文件被进程打开-n:不显示主机名,直接显示 ip-P:不显示端口名,直接显示端口号-s:列出文件大小示例:# 查看占用文件的进程 lsof /usr/sbin/sshd # 查看指定程序名,打开的文件 lsof -c sshd # 显示文件夹下被打开的文件有哪些 lsof +d /var/log # 指定 pid,查看这个进程所使用的文件 lsof -p 811结束进程的命令结束指定 pid 的进程kill语法:kill [信号] PID作用:kill 命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的 PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作# 信号: [root@openeuler ~]# kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX 常用信号解释:SIGTERM:kill命令,不指定任何信号,默认就是这个信息,告诉程序你可以结束了。SIGKILL:强制性终止,危险的信号。SIGHUP无须关闭进程,重新加载配置文件,如 reload 操作。根据进程名杀死killallpkill# example killall vim pkill vim进程后台运行命令command &:将未启动的 command 放入当前 ssh 的后台去运行,但是当 ssh 会话【异常断开】,后台的进程就会丢失。jobs:查看后台进程列表。ctrl + z:暂停进程。bg:进程放入后台运行,和 & 一样。fg:将后台命令放入到前台运行。nohup(no hang up):用于在系统后台不挂断地运行,及时回话异常断开也不会影响程序的运行,真正的将执行的命令放入到后台运行,并且会把日志输入到当前目录中 ./nohup.out 文件中。nohup ping qq.com &监控命令1、cpu、磁盘 i/o 指标实践[root@openEuler ~]# dnf install -y stress # cpu、磁盘压力测试 [root@openEuler ~]# stress -c 2 -i 2 --timeout 300s & # 在后台模拟两个CPU核心和两个磁盘I/O线程的压力,持续300秒查看 cpu 利用率mpstat-P:显示指定 CPU 的统计信息,如“-P ALL”表示显示所有 CPU 的统计信息,“-p 1,2”表示显示第2路和第3路的 CPU 统计信息。-T:在显示中展示拓扑原色,通常和 -u 结合使用。-o:统计信息以 JSON 的格式展现。[root@openEuler ~]# mpstat -P ALL 5 2 Linux 3.10.0-1160.el7.x86_64 (openEuler) 02/28/2024 _x86_64_ (2 CPU) 08:13:50 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 08:13:55 PM all 73.50 0.00 26.50 0.00 0.00 0.00 0.00 0.00 0.00 0.00 08:13:55 PM 0 70.20 0.00 29.80 0.00 0.00 0.00 0.00 0.00 0.00 0.00 08:13:55 PM 1 76.65 0.00 23.35 0.00 0.00 0.00 0.00 0.00 0.00 0.00 08:13:55 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 08:14:00 PM all 73.23 0.00 26.77 0.00 0.00 0.00 0.00 0.00 0.00 0.00 08:14:00 PM 0 77.45 0.00 22.55 0.00 0.00 0.00 0.00 0.00 0.00 0.00 08:14:00 PM 1 69.00 0.00 31.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle Average: all 73.36 0.00 26.64 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: 0 73.83 0.00 26.17 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: 1 72.83 0.00 27.17 0.00 0.00 0.00 0.00 0.00 0.00 0.00ps[root@openEuler ~]# ps -aux --sort -%cpu | head -n 4 # 列出系统中CPU使用率最高的前四条信息 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1750 74.2 0.0 7312 100 pts/0 R 20:13 0:47 stress -c 2 -i 2 --timeout 300s root 1748 64.8 0.0 7312 100 pts/0 R 20:13 0:41 stress -c 2 -i 2 --timeout 300s root 1749 29.5 0.0 7312 100 pts/0 R 20:13 0:18 stress -c 2 -i 2 --timeout 300shtoptopglances查看系统平均负载[root@openEuler ~]# uptime 18:58:02 up 16 min, 2 users, load average: 7.96, 3.12, 1.172、上下文切换指标实践# 上下文切换压测 sysbench --threads=4 --time=300 threads run & # 查看系统上下文切换 [root@openEuler ~]# vmstat 3 5 # 每隔3秒钟执行一次命令,执行五秒 procs -----------memory----+------ ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 4 0 0 1532748 2076 300088 0 0 9 4 135 236 3 8 89 0 0 4 0 0 1532748 2076 300088 0 0 0 0 2010 6480112 16 84 0 0 0 4 0 0 1532748 2076 300088 0 0 0 0 2015 6246754 17 83 0 0 0 4 0 0 1532748 2076 300088 0 0 0 0 2010 6369602 17 83 0 0 0 4 0 0 1532748 2076 300088 0 0 0 0 2009 6584834 16 84 0 0 0 [root@openEuler ~]# pidstat -w 5 2 -t | grep sysbench # cswch/s:进程每秒主动上下文切换的总数 # 主动上下文切换发生在进程堵塞时,因为进程需要的资源不可用 # nvcswch/s:进程每秒被迫上下文切换的总数 # 进程被迫上下文切换发生在 CPU 时间切换时,强制进程放弃处理器3、系统内存指标实践系统内存,工具:free、vmstat物理内存(memory)交换系统内存(swap):当内存不够用时,系统把会硬盘当做内存来使用。缓冲(buffer):buffer 是指,写入数据时,把分散的写入操作保存到内存,达到一定程度集中写入硬盘,减少磁盘碎片,以及反复的寻道时间,加速数据写入。缓存(cache):cache 是指,把读取磁盘而来的数据存在内存中,再次读取,下次就不用读取硬盘了,而直接从内存中读取,加速数据读取过程。进程内存,工具:top虚拟内存(VIRT):需要的虚拟内存驻留内存(RSE):实际使用的内存共享内存(SHR):与其他进程的共享的内存示例:# 物理内存性能压测 stress --vm 2 --vm-bytes 300M --vm-keep --timeout 300s & # 查看系统虚拟内存 [root@openEuler ~]# vmstat -a -S M 3 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free inact active si so bi bo in cs us sy id wa st 4 0 0 896 106 799 0 0 9 4 160 1303 5 9 86 0 0 2 0 0 896 106 799 0 0 0 0 2018 97 100 0 0 0 0 2 0 0 896 106 799 0 0 0 1 2019 88 100 0 0 0 0 3 0 0 896 106 799 0 0 0 25 2010 83 100 0 0 0 0 2 0 0 896 106 799 0 0 0 0 2011 81 100 0 0 0 0 # 进程内存压测 sysbench --threads=4 --time=300 threads run --timeout 300s & # 查看内存进程 top top -> M4、磁盘 i/o 指标实践磁盘 i/o 主要指标IOPS(input output per second):每秒钟磁盘能处理的读写请求数量吞吐量:每秒磁盘读写的流量示例:# 磁盘I/O读写性能压测 [root@openEuler ~]# fio -filename=/data/test.file -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=16k -size=2G -numjobs=10 -runtime=60 -group_reporting -name=test_r_w查看sarsar -d 3 3iostatiostat -dh 3 3 5、网络I/O性能指标实践网络连接状态:TCP、UDP、HTTP等响应时间:用户从发出请求到接受完响应之间的总耗时带宽:单位时间内能传输的数据量示例:# 安装网络性能测试工具iperf [root@openEuler ~]# dnf install -y iperf # 查看网络连接状态 [root@openEuler ~]# netstat -antulp # 常用选项: # -n:表示不解析服务名称,以端口号的形式呈现给你 # -l:显示监听服务器套接字 # -t:表示只列出 tcp 协议的连接 # -u:表示只列出 udp 协议的连接 # -p:表示显示进程 pid 和进程名称 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 816/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 911/master tcp 0 0 192.168.113.31:57826 210.44.151.62:80 TIME_WAIT - tcp 0 0 192.168.113.31:57828 210.44.151.62:80 TIME_WAIT - tcp 0 0 192.168.113.31:48710 103.77.111.8:443 TIME_WAIT - tcp 0 0 192.168.113.31:36640 222.139.215.198:443 TIME_WAIT - tcp 0 36 192.168.113.31:22 192.168.113.1:60417 ESTABLISHED 2191/sshd: root@pts tcp 0 0 192.168.113.31:33214 59.69.128.21:443 TIME_WAIT - tcp 0 0 192.168.113.31:50514 101.6.15.130:443 TIME_WAIT - # 查看网络响应时间 [root@openEuler ~]# ping www.baidu.com -c 3 PING www.baidu.com (220.181.38.150) 56(84) bytes of data. 64 bytes from 220.181.38.150 (220.181.38.150): icmp_seq=1 ttl=128 time=24.9 ms 64 bytes from 220.181.38.150 (220.181.38.150): icmp_seq=2 ttl=128 time=24.5 ms 64 bytes from 220.181.38.150 (220.181.38.150): icmp_seq=3 ttl=128 time=24.6 ms --- www.baidu.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 24.552/24.699/24.932/0.210 ms # 查看网络带宽,iperf可以报告带宽、延迟抖动和数据包丢失,是排查网络问题、定位网络瓶颈的重要工具。 # 1.服务器开启服务 # 登录内网下任意一台ECS用作Server [root@Server ~]# iperf -s # —S,--server:开启 Server 模式 ----------------------------------------------------------- Server listening on 5201 (test #1) ----------------------------------------------------------- # 2.客户端测试内网带宽 [root@openEuler ~]# iperf -c 192.168.113.128 -t 20 -i 5 # -c,--client <host>:开启 Client 模式,连接到指定主机;-t,指定测试的时间;-i:指定吞吐量报告的时间间隔 ------------------------------------------------------------ Client connecting to 192.168.113.128, TCP port 5001 TCP window size: 1.14 MByte (default) ------------------------------------------------------------ [ 3] local 192.168.113.31 port 39442 connected with 192.168.113.128 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0- 5.0 sec 3.60 GBytes 6.18 Gbits/sec [ 3] 5.0-10.0 sec 3.79 GBytes 6.50 Gbits/sec [ 3] 10.0-15.0 sec 3.75 GBytes 6.45 Gbits/sec [ 3] 15.0-20.0 sec 3.78 GBytes 6.49 Gbits/sec [ 3] 0.0-20.0 sec 14.9 GBytes 6.40 Gbits/sec # 查看网络接口的吞吐量 [root@ansible yum.repos.d]# sar -n DEV 2 1 Linux 3.10.0-1160.el7.x86_64 (ansible) 02/28/2024 _x86_64_ (2 CPU) 11:40:11 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s 11:40:13 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 11:40:13 PM ens33 12663.50 570179.50 816.38 1633307.83 0.00 0.00 0.00 Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: ens33 12663.50 570179.50 816.38 1633307.83 0.00 0.00 0.00
-
前言性能是操作系统至关重要的一部分,openEuler在每个版本迭代的过程中,也十分看重性能的表现。本文将向各位介绍openEuler性能测试中常用的测试套和测试原则,希望可以帮助大家更好地理解性能测试这个重要的领域。1. 基础性能测试1.1 stream测试1.1.1 测试套介绍Stream主要对内存带宽的实际性能进行测试,支持通过copy、scale、add、triad四种运算方式测试内存带宽的性能。Copy先访问一个内存单元,读出值再写入到另一个内存单元。Scale读出一个内存单元的值,做一个乘法运算,再将结果写入到另一个内存单元。Add操作先从内存单元读出两个值,做加法运算, 再将结果写入到另一个内存单元。Triad将三个测试组合起来,先从内存单元中读两个值a、b,对其进行乘加混合运算(a + 因子 * b ) ,将运算结果写入到另一个内存单元。Stream会直接输出测试报告,结果简洁易读。结果Add >Trial>Copy>Scale。原因:Add 两个读操作,一个写操作,三次访问内存。Trial虽说也是三次访问内存,但操作复杂,所以带宽比Add略小,copy和scale都是两次访存,但是scale操作复杂,所以带宽比copy略小。1.1.2 几个重要的编译参数-DSTREAM_ARRAY_SIZEstream.c源码中定义了该参数的值建议范围,即大于L3 cache 的4倍。对于单个CPU,保证测试数组总大小(STREAM_ARRAY_SIZE*sizeof(double))至少是3.8倍的L3 cache size。-fopenmp该编译选项启用后,默认开启满核测试,可测试满核的内存带宽。-DNTIMES默认值为10。迭代多次,返回剔除第一次结果的最佳结果,可提高该值,增加测试结果的稳定性。1.1.3 常见影响测试套的领域编译器GCC:例如矢量化编译优化。内核:64K页表的内核下开启透明大页可导致性能衰退。硬件:测试机器的内存容量、内存频率、BIOS内存相关的配置会影响测试结果。1.2 lmbench1.2.1 测试套介绍lmbench 是一套简易可移植的,符合ANSI/C 标准为UNIX/POSIX 而制定的微型测评工具。一般来说,它衡量两个关键特征:时延和带宽。主要功能如下:带宽测评工具:读取缓存文件、拷贝内存、读内存、写内存、管道、TCP。时延测评工具:上下文切换、本地网络(连接的建立、管道、TCP、UDP等)、文件系统的创建和删除、系统调用(进程创建、信号处理等)、内存(L1、L2、main mem、rand mem)等。还可以用于测试跨node、跨片、跨die时延。测试结果输出如下:1.2.2 测试项分类系统调用时延:同类的测试套,如专测系统调用的libmicro测试套。系统调用一般涉及glibc、编译器、以及内核上的改动均可能产生性能影响。上下文切换时延:内核调度方面的影响。本地通信时延:内核网络协议栈方面的影响。文件系统及虚拟内存时延:内核文件系统、虚拟内存影响。本地带宽:内核访存、管道等方面影响。内存时延:不同层级访存影响(L1、L2、主存、随机访存)。当然除上层内核影响大,底层如BIOS、芯片对上述测试项也常有较大影响,也需关注BIOS版本、BIOS选项上的影响。1.3 netperf测试1.3.1 测试套介绍Netperf是一种网络性能的测量工具(由惠普公司开发的,测试网络栈。即测试不同类型的网络性能的benchmark工具)主要针对基于TCP或UDP的传输测试。Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。Netperf测试结果所反映的是一个系统能够以多快的速度向另外一个系统发送数据,以及另外一个系统能够以多快的速度接收数据。工作原理:1.3.2 测试项分类1)STREAM类:TCP_STREAM:用来测试进行TCP批量传输TCP数据分组过程时的吞吐量。UDP_STREAM:用来测试进行UDP批量传输时的网络吞吐量。2)RR类:TCP_RR:测试对象是多次TCP request和response的交易过程,但是它们发生在同一个TCP连接中,这种模式常常出现在数据库应用中。TCP_CRR:与TCP_RR不同,TCP_CRR为每次交易建立一个新的TCP连接。最典型的应用就是HTTP。UDP_RR:UDP_RR方式使用UDP分组进行request/response的交易过程。由于没有TCP连接所带来的负担,所以交易率一定会有相应的提升。netperf由于涉及请求的频繁发送与频繁响应,因此无论是客户端还是服务端,任何一边性能差都对测试结果有显著的影响。1.4 fio1.4.1 测试套介绍fio是一个开源压力测试工具,主要用来测试硬盘IO性能。这个工具的可定制性非常强,可以根据测试者的想法进行各种混合io测试,它支持13种不同类型io引擎(libaio、sync、mmap、posixaio、network等等)。它可以测试块设备或文件,可以通过多线程或进程模拟各种io操作,可以测试统计iops、带宽和时延等性能。当前我们通常使用异步IO引擎libaio,并结合direct=1,以绕过文件系统缓存来测试硬盘的真实IO性能。关注的指标为:IOPS和带宽。1.4.2 重点参数参数参数值解释filename设备名或文件名,如:裸设备/dev/sdb,文件/home/test.img定义测试对象,一般是设备或者文件。如果想测试裸盘设备/dev/sdb,可以设置filename=/dev/sdb;如果想要测试文件系统性能,则可以设置filename=/home/test.imgname测试名称定义测试名称。必填项,本地fio测试的名称,对性能没有影响。rw测试类型,可选值有:read,write,rw,randread,randwrite,randrw定义测试的读写类型:read-顺序读,write-顺序写,rw(readwrite)- 混合顺序读写,randread- 随机读,randwrite-随机写,randrw-混合随机读写。对于读写混合类型来说,默认读写比例为1:1rwmixwrite,rwmixread混合读写中读写占用比例,可选值为[0,100]定义在混合读写模式中,写或读所占的比例。举例来说,rwmixread值为10,则表示读写比为10:90。ioengineio引擎选择,可选值有sync、libaio、psync、vsync、mmap等定义fio如何下发io请求。sync:基本的read、write io。 libaio:linux原生的异步io,linux只支持non-buffer情况下的排队操作。默认值为psync,该模式为同步io模型,异步io模型libaio,一般结合direct=1使用。direct0或1定义是否使用direct io:值为0,表示使用buffered io;值为1,表示使用direct io。bs带单位的数字定义io的块大小,单位是k,K,m,M。默认值为4k。numjobs正整数定义测试的进程/线程数,默认值为1,如果指定了thread参数,则使用单进程多线程模式,否则使用多进程模式iodepth正整数定义每个进程/线程可以同时下发的io任务数,默认为1,适用于异步io场景,同步io场景要等前一个io任务完成才能下发下一个任务,所以iodepth并不起作用。cpu_allowed指定cpu的corefio测试的所有进程/线程可以选择的cpu核,可以是单独一个或者多个核,也可以是一个范围。1.4.3 测试项测试一般关注顺序读、顺序写、随机读、随机写、混合读写,覆盖小包例如4K,大包例如1024K。测试的硬盘通常选用NVMe SSD,文件系统采用EXT4/XFS。关注指标:IOPS和带宽BW。一般性能问题基本集中在小包,主要受内核在存储IO栈以及文件系统的性能影响。1.5 iozone31.5.1 测试套介绍iozone是一个文件系统的benchmark工具,可以测试不同的操作系统中文件系统的读写性能,可以通过 write, re-write, read, re-read, random read, random write, 等不同的模式下测试硬盘的性能。 测试的时候请注意,设置的测试文件的大小一定要大过你的内存(最佳为内存的两倍大小),不然linux会给你的读写的内容进行缓存,会使数值非常不准确。Write: 测试向一个新文件写入的性能。当一个新文件被写入时,不仅仅是那些文件中的数据需要被存储,还包括那些用于定位数据存储在存储介质的具体位置的额外信息。这些额外信息被称作“元数据”。它包括目录信息,所分配的空间和一些与该文件有关但又并非该文件所含数据的其他数据。因此,Write的性能通常会比Re-write的性能低。Re-write: 测试向一个已存在的文件写入的性能。当一个已存在的文件被写入时,所需工作量较少,因为此时元数据已经存在。Re-write的性能通常比Write的性能高。Read: 测试读一个已存在的文件的性能。Re-Read: 测试读一个最近读过的文件的性能。Re-Read性能会高些,因为操作系统通常会缓存最近读过的文件数据。这个缓存可以被用于读以提高性能。Random Read: 测试读一个文件中的随机偏移量的性能。许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。Random Write: 测试写一个文件中的随机偏移量的性能。同样,许多因素可能影响这种情况下的系统性能,例如:操作系统缓存的大小,磁盘数量,寻道延迟和其他。1.6 unixbench1.6.1 测试套介绍UnixBench是一个类unix系(Unix,BSD,Linux)统下的性能测试工具,一个开源工具,被广泛用于测试linux系统主机的性能。Unixbench的主要测试项目有:系统调用、读写、进程、图形化测试、2D、3D、管道、运算、C库等系统基准性能提供测试数据。该测试套涉及12个测试子项,可分为以下几类:Double-Precision Whetstone:此项用于测试 string handling,因为没有浮点操作,所以深受软件和硬件设计(hardware and software design)、编译和链接(compiler and linker options)、代码优化(code optimazaton)、对内存的cache(cache memory)、等待状态(wait states)、整数数据类型(integer data types)的影响。Double-Precision Whetstone:这一项测试浮点数操作的速度和效率。这一测试包括几个模块,每个模块都包括一组用于科学计算的操作。覆盖面很广的一系列 c 函数:sin,cos,sqrt,exp,log 被用于整数和浮点数的数学运算、数组访问、条件分支(conditional branch)和程序调用。此测试同时测试了整数和浮点数算术运算。Execl Throughput:测试30秒内可以执行的 execl 系统调用的次数。execl 系统调用是 exec 函数族的一员。它和其他一些与之相似的命令一样是 execve() 函数的前端。File copy:测试10秒内从一个文件向另外一个文件传输数据的速率。每次测试使用不同大小的缓冲区。这一针对文件 read、write、copy 操作的测试统计规定时间内的文件 read、write、copy 操作次数。Pipe Throughput:测试10秒内一个进程可以向一个管道写 512 字节数据然后再读回的次数。Pipe-based Context Switching:测试两个进程10秒内通过一个管道交换一个不断增长的整数的次数。测试打开两个管道,开启两个进程,其中一个进程往管道1写,往管道2读,另一个进程往管道2写,往管道2读,一个进程完成一次读写,计数+1。Process Creation:测试30秒内一个进程可以创建子进程然后收回子进程的次数。简单地说,就是不停调用fork函数,创建进程,并立马退出,成功一次计数+1。一般说来,这个测试被用于对操作系统进程创建这一系统调用的不同实现的比较。System Call Overhead:测试10秒内反复地连续调用几个系统调用(getpid、getuid、umask等)的次数,测试进入和离开操作系统内核的代价。Shell Scripts:测试60秒内一个进程可以并发地开始一个 shell 脚本的 n 个拷贝的次数。首先通过fork函数,创建进程,不停地执行一个脚本(pgms/multi.sh), 执行成功一次+1.其中,shell1表示执行脚本内只有一个子任务执行,shell8表示,执行脚本内会同时起8个子任务并发执行。1.7 speccpu 20171.7.1 测试套介绍SpecCPU2017是一套CPU子系统测试工具,包括4大种类套件共43个基准测试。4大种类套件如下:整数型:SPECrate 2017 Integer,对应用例编号为5xx。SPECspeed 2017 Integer,对应用例编号为6xx。浮点型:SPECrate 2017 Floating Point,对应用例编号为5xx。SPECspeed 2017 Floating Point,对应用例编号为6XX。SPEC基准广泛用于评估计算机系统的性能。SPEC CPU套件通过测量几个程序(例如编译器GCC,化学程序游戏和天气程序WRF等)的运行时间来测试CPU性能。Spec2017测试有两种评估方式,分为speed和rate。speed是测试完成一项任务需要的时间,即速度测试。rate是测试单位时间内可以完成多少任务,即throughput(吞吐量测试)。speed和rate测试又分为整数(Integer)和浮点(Floating Point)测试。1.7.2 测试项分类一般来说,rate类的测试性能出问题,基本编译器影响最大(通常绑核测试,不涉及调度),而speed类由于是并发测试,涉及调度,因此性能问题一般更多与内核有关系。常见的透明大页、OpenMP参数调优、CPU幽灵漏洞、大页机制也会影响测试套性能,目前OS上的调优手段相对有限,更多还是依赖编译器的优化能力。2. 性能测试的基本原则使用同一硬盘进行测试,可挂载同一硬盘作为数据盘或使用系统盘作为数据盘(保证硬盘的参数正常)。如测试项可能受文件系统影响,还需关注测试硬盘的文件系统类型。测试使用同一主机,保持基本硬件一致。测试保证测试工具版本一致。测试需要时需记录GCC、binutils、glibc、kernel、测试工具等版本信息,文件系统类型,硬盘类型,主频,核数、内存、CPU数量与型号、内存主频等硬件配置。测试考虑是否清缓存sync && sysctl -w vm.drop_caches=3。转自:cid:link_0
上滑加载中
推荐直播
-
全面解析华为云EI-API服务:理论基础与实践应用指南
2024/11/29 周五 18:20-20:20
Alex 华为云学堂技术讲师
本期直播给大家带来的是理论与实践结合的华为云EI-API的服务介绍。从“主要功能,应用场景,实践案例,调用流程”四个维度来深入解析“语音交互API,文字识别API,自然语言处理API,图像识别API及图像搜索API”五大场景下API服务,同时结合实验,来加深开发者对API服务理解。
去报名 -
企业员工、应届毕业生、在读研究生共探项目实践
2024/12/02 周一 19:00-21:00
姚圣伟 在职软件工程师 昇腾社区优秀开发者 华为云云享专家 HCDG天津地区发起人
大神带你一键了解和掌握LeakyReLU自定义算子在ONNX网络中应用和优化技巧,在线分享如何入门,以及在工作中如何结合实际项目进行学习
即将直播 -
昇腾云服务ModelArts深度解析:理论基础与实践应用指南
2024/12/03 周二 14:30-16:30
Alex 华为云学堂技术讲师
如何快速创建和部署模型,管理全周期AI工作流呢?本期直播聚焦华为昇腾云服务ModelArts一站式AI开发平台功能介绍,同时结合基于ModelArts 的实践性实验,帮助开发者从理论到实验更好地理解和使用ModelArts。
去报名
热门标签