-
1 简介 简称mc,是minio服务器的客户端,对ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案,它支持文件系统和兼容Amazon S3的云存储服务(AWS Signature v2和v4)。 ls 列出文件和文件夹。 mb 创建一个存储桶或一个文件夹。 cat 显示文件和对象内容。 pipe 将一个STDIN重定向到一个对象或者文件或者STDOUT。 share 生成用于共享的URL。 cp 拷贝文件和对象。 mirror 给存储桶和文件夹做镜像。 find 基于参数查找文件。 diff 对两个文件夹或者存储桶比较差异。 rm 删除文件和对象。 events 管理对象通知。 watch 监听文件和对象的事件。 policy 管理访问策略。 session 为cp命令管理保存的会话。 config 管理mc配置文件。 update 检查软件更新。 version 输出版本信息。 2 Centos 7 安装mc [root@hadoop001 MinIOClient]# wget http://dl.minio.org.cn/client/mc/release/linux-amd64/mc [root@hadoop001 MinIOClient]# chmod +x mc [root@hadoop001 MinIOClient]# mv mc /usr/bin/ # 查看帮助 [root@hadoop001 MinIOClient]# mc -h 添加服务器节点: [root@hadoop001 MinIOClient]# mc config host add s3 http://192.168.58.201:9000 admin admin123 --api s3v4 [root@hadoop001 MinIOClient]# mc config host ls # 查看s3下的所有存储桶 [root@hadoop001 MinIOClient]# mc ls s3 可以看到当前我们添加名称为s3的节点,及这个节点下的所有存储桶: 3 常用命令 3.1 ls 列出存储桶和对象 ls命令列出文件、对象和存储桶。使用–incomplete flag可列出未完整拷贝的内容。 用法: mc ls [FLAGS] TARGET [TARGET ...] FLAGS: --help, -h 显示帮助。 --recursive, -r 递归。 --incomplete, -I 列出未完整上传的对象。 示例: 列出所有s3上的存储桶。 [root@hadoop001 MinIOClient]# mc ls s3 示例: 列出所有s3上的存储桶mall4cloud下的文件。 [root@hadoop001 MinIOClient]# mc ls s3/mall4cloud 3.2 mb命令 - 创建存储桶 mb命令在对象存储上创建一个新的存储桶。在文件系统,它就和mkdir -p命令是一样的。存储桶相当于文件系统中的磁盘或挂载点,不应视为文件夹。MinIO对每个用户创建的存储桶数量没有限制。 在Amazon S3上,每个帐户被限制为100个存储桶。 用法: mc mb [FLAGS] TARGET [TARGET...] FLAGS: --help, -h 显示帮助。 --region "us-east-1" 指定存储桶的region,默认是‘us-east-1’. 示例:在s3上创建一个名叫"bucket"的存储桶。 [root@hadoop001 MinIOClient]# mc mb s3/bucket 3.3 cat命令 - 合并对象 cat命令将一个文件或者对象的内容合并到另一个上。你也可以用它将对象的内容输出到stdout。 用法: mc cat [FLAGS] SOURCE [SOURCE...] FLAGS: --help, -h 显示帮助。 示例: 显示2a10430fc3134e2196fa06eadfe25b23文件的内容 [root@hadoop001 MinIOClient]# mc cat s3/mall4cloud/2023/09/08/2a10430fc3134e2196fa06eadfe25b23 3.4 pipe命令 - Pipe到对象 pipe命令拷贝stdin里的内容到目标输出,如果没有指定目标输出,则输出到stdout。 用法: mc pipe [FLAGS] [TARGET] FLAGS: --help, -h 显示帮助。 示例: 将MySQL数据库dump文件输出到Amazon S3。 mysqldump -u root -p ******* accountsdb | mc pipe s3/sql-backups/backups/accountsdb-oct-9-2015.sql 3.5 cp命令 - 拷贝对象 cp命令拷贝一个或多个源文件目标输出。所有到对象存储的拷贝操作都进行了MD4SUM checkSUM校验。可以从故障点恢复中断或失败的复制操作。 用法: mc cp [FLAGS] SOURCE [SOURCE...] TARGET FLAGS: --help, -h 显示帮助。 --recursive, -r 递归拷贝。 示例: 拷贝一个本地文本文件到对象存储s3/aaaa。 [root@hadoop001 MinIOClient]# mc cp starh.sh s3/aaaa 3.6 rm命令 - 删除存储桶和对象。 使用rm命令删除文件对象或者存储桶。 用法: mc rm [FLAGS] TARGET [TARGET ...] FLAGS: --help, -h 显示帮助。 --recursive, -r 递归删除。 --force 强制执行删除操作。 --prefix 删除批配这个前缀的对象。 --incomplete, -I 删除未完整上传的对象。 --fake 模拟一个假的删除操作。 --stdin 从STDIN中读对象列表。 --older-than value 删除N天前的对象(默认是0天)。 示例1: 删除一个对象。 [root@hadoop001 MinIOClient]# mc rm s3/aaaa/starh.sh 示例2:删除一个存储桶并递归删除里面所有的内容。由于这个操作太危险了,你必须传–force参数指定强制删除。 [root@hadoop001 MinIOClient]# mc rm --recursive --force s3/qqqqq 示例3: 从mybucket里删除所有未完整上传的对象。 [root@hadoop001 MinIOClient]# mc rm --incomplete --recursive --force s3/bucket 示例4: 删除一天前的对象。 [root@hadoop001 MinIOClient]# mc rm --force --older-than=1 s3/bucket/oldsongs 3.7 share命令 - 共享 share命令安全地授予上传或下载的权限。此访问只是临时的,与远程用户和应用程序共享也是安全的。如果你想授予永久访问权限,你可以看看mc policy命令。 生成的网址中含有编码后的访问认证信息,任何企图篡改URL的行为都会使访问无效。想了解这种机制是如何工作的,请参考Pre-Signed URL技术。 用法: mc share [FLAGS] COMMAND FLAGS: --help, -h 显示帮助。 COMMANDS: download 生成有下载权限的URL。 upload 生成有上传权限的URL。 list 列出先前共享的对象和文件夹。 3.8 子命令share download - 共享下载 share download命令生成不需要access key和secret key即可下载的URL,过期参数设置成最大有效期(不大于7天),过期之后权限自动回收。 用法: mc share download [FLAGS] TARGET [TARGET...] FLAGS: --help, -h 显示帮助。 --recursive, -r 递归共享所有对象。 --expire, -E "168h" 设置过期时限,NN[h|m|s]。 示例: 生成一个对一个对象有4小时访问权限的URL。 [root@hadoop001 MinIOClient]# mc share download --expire 4h s3/aaaa/aa.txt 3.9 子命令share upload - 共享上传 share upload命令生成不需要access key和secret key即可上传的URL。过期参数设置成最大有效期(不大于7天),过期之后权限自动回收。 Content-type参数限制只允许上传指定类型的文件。 用法: mc share upload [FLAGS] TARGET [TARGET...] FLAGS: --help, -h 显示帮助。 --recursive, -r 递归共享所有对象。 --expire, -E "168h" 设置过期时限,NN[h|m|s]. 示例: 生成一个curl命令,赋予上传到play/mybucket/myotherobject.txt的权限。 [root@hadoop001 MinIOClient]# mc share upload s3/bucket/myotherobject.txt 3.10 子命令share list - 列出之前的共享 share list列出没未过期的共享URL。 用法: mc share list COMMAND COMMAND: upload: 列出先前共享的有上传权限的URL。 download: 列出先前共享的有下载权限的URL。 3.11 mirror命令 - 存储桶镜像 mirror命令和rsync类似,只不过它是在文件系统和对象存储之间做同步。 用法: mc mirror [FLAGS] SOURCE TARGET FLAGS: --help, -h 显示帮助。 --force 强制覆盖已经存在的目标。 --fake 模拟一个假的操作。 --watch, -w 监听改变并执行镜像操作。 --remove 删除目标上的外部的文件。 示例: 将一个本地文件夹minio镜像到https://play.min.io上的’bucket’存储桶。 [root@hadoop001 MinIOClient]# mc mirror …/minio/MinIOClient/bucket 3.12 find命令 - 查找文件和对象 find命令通过指定参数查找文件,它只列出满足条件的数据。 用法: mc find PATH [FLAGS] FLAGS: --help, -h 显示帮助。 --exec value 为每个匹配对象生成一个外部进程(请参阅FORMAT) --name value 查找匹配通配符模式的对象。 ... 示例: 持续从s3存储桶中查找所有jpeg图像,并复制到minio "minio/MinIOClient/bucket"存储桶 [root@hadoop001 MinIOClient]# mc find s3/bucket --name "*.jpg" --watch --exec "mc cp {} minio/MinIOClient/bucket" 3.13 diff命令 - 显示差异 diff命令计算两个目录之间的差异。它只列出缺少的或者大小不同的内容。 它不比较内容,所以可能的是,名称相同,大小相同但内容不同的对象没有被检测到。这样,它可以在不同站点或者大量数据的情况下快速比较。 用法: mc diff [FLAGS] FIRST SECOND FLAGS: --help, -h 显示帮助。 示例: 比较一个本地文件夹和一个远程对象存储服务 [root@hadoop001 minio]# mc diff localdir minio/MinIOClient/bucket 4 其他 其他命令不一一列出,请在官网详细阅读 https://minio.org.cn/docs/minio/linux/reference/minio-mc.html?ref=docs ———————————————— 版权声明:本文为CSDN博主「吴名氏.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_37284798/article/details/132900357
-
1 纠删码 Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据 1.1 什么叫纠删码 纠删码是一种用于重建丢失或损坏数据的数学算法。 纠删码(erasure coding,EC)是一种数据保护方法,它将数据分割成片段,把冗余数据块扩展、编码,并将其存储在不同的位置,比如磁盘、存储节点或者其它地理位置。 Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块。 这就意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验块,你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复。 1.2 为什么纠删码有用? 纠删码的工作原理和RAID或者复制不同,像RAID6可以在损失两块盘的情况下不丢数据,而Minio纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且Minio纠删码是作用在对象级别,可以一次恢复一个对象,而RAID是作用在卷级别,数据恢复时间很长。 Minio对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。Minio纠删码的设计目标是为了性能和尽可能的使用硬件加速。 1.3 什么是位衰减bit rot保护? 位衰减又被称为数据腐化Data Rot、无声数据损坏Silent Data Corruption,是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。正所谓明枪易躲,暗箭难防,这种背地里犯的错比硬盘直接咔咔宕了还危险。 不过不用怕,Minio纠删码采用了高速 HighwayHash 基于哈希的校验和来防范位衰减。 2 纠错码单机模式环境搭建 2.1 创建存储文件夹 这里直接在D盘下创建了四个文件夹,也可以在不同的盘符下创建。 2.2 启动 直接在启动命名最后添加多个存贮位置就可以了。 # 设置用户名 set MINIO_ROOT_USER=admin # 设置密码(8位) set MINIO_ROOT_PASSWORD=admin123 # 指定启动端口(未指定默认9000)、控制台端口90001及存储位置 minio.exe server --address :9000 --console-address :9001 D:\tools\minio\data01 D:\tools\minio\data02 D:\tools\minio\data03 D:\tools\minio\data04 启动命令后,控制台显示了警告信息,这里只配置了4个位置,所以两个以上损坏就会造成数据不可用。 警告:主机本地有2个以上的驱动器故障,将导致数据变得不可用。 Status显示当前4个驱动器在线,0个不在线。 登录后查看控制台,也能看到当前所有驱动器的状态。 2.3 测试 首先上传一张150K大小的照片。 查看硬盘中文件,发现这4个文件下都存在以上传文件名命名的文件夹,而不是直接的文件了,是以文件名创建文件夹,然后将文件分片为了文件块的元数据。 然后我们删除data03和data04文件夹,然后会发现,被删除的文件夹竟然马上自动恢复了过来。然后直接删除data03和data04文件夹下的元数据: 发现尽管删除了两份分片数据,依然可以正常下载。 接着再删了一个元数据,发现该文件就会找不到了,说明半数以上元数据丢失,这个文件就真的找不到了。。。 3 分布式MinIO 分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。 3.1 分布式存储可靠性常用方法 分布式存储,很关键的点在于数据的可靠性,即保证数据的完整,不丢失,不损坏。只有在可靠性实现的前提下,才有了追求一致性、高可用、高性能的基础。而对于在存储领域,一般对于保证数据可靠性的方法主要有两类,一类是冗余法,一类是校验法。 3.1.1 冗余 冗余法最简单直接,即对存储的数据进行副本备份,当数据出现丢失,损坏,即可使用备份内容进行恢复,而副本备份的多少,决定了数据可靠性的高低。这其中会有成本的考量,副本数据越多,数据越可靠,但需要的设备就越多,成本就越高。可靠性是允许丢失其中一份数据。当前已有很多分布式系统是采用此种方式实现,如Hadoop的文件系统(3个副本),Redis的集群,MySQL的主备模式等。 3.1.2 校验 校验法即通过校验码的数学计算的方式,对出现丢失、损坏的数据进行校验、还原。注意,这里有两个作用,一个校验,通过对数据进行校验和( checksum )进行计算,可以检查数据是否完整,有无损坏或更改,在数据传输和保存时经常用到,如TCP协议;二是恢复还原,通过对数据结合校验码,通过数学计算,还原丢失或损坏的数据,可以在保证数据可靠的前提下,降低冗余,如单机硬盘存储中的RAID技术,纠删码(Erasure Code)技术等。MinlO采用的就是纠删码技术。 3.2 分布式Minio有什么好处? 在大数据领域,通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。 3.2.1 数据保护 分布式Minio采用 纠删码来防范多个节点宕机和位衰减bit rot。 分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。 3.2.2 高可用 单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。 例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不过你需要9台服務器才能写数据。 注意,只要遵守分布式Minio的限制,你可以组合不同的节点和每个节点几块硬盘。比如,你可以使用2个节点,每个节点4块硬盘,也可以使用4个节点,每个节点两块硬盘,诸如此类。 3.2.3 一致性 Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。 ———————————————— 版权声明:本文为CSDN博主「吴名氏.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_37284798/article/details/132872990
-
1 Minio简介 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。 MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。目前支持JavaScript 、Java、Python、Golang、.NET。 MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。 MinIO与传统的存储和其他的对象存储不同的是:它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为MinIO一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去MinIO的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的原生对象存储服务。 MinIO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。同时,它在机器学xi、私有云、混合云等方面的存储技术上也独树一帜。当然,也不排除数据分析、高性能应用负载、原生云的支持。 在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品 MinIO现在也是CNCF成员,在云原生存储部分和ceph等一起作为目前的解决方案之一。 2 Minio优点 2.1 Erasure Coding(消除编码) MinIO 使用以汇编代码编写的每个对象内联擦除编码来保护数据,以提供尽可能高的性能。 MinIO 使用 Reed-Solomon 代码将对象条带化为具有用户可配置冗余级别的数据和奇偶校验块。 MinIO 的纠删码在对象级别执行修复,可以独立修复多个对象。 在最大奇偶校验为 N/2 的情况下,MinIO 的实现可以确保部署中只有 ((N/2)+1) 个可操作驱动器的不间断读写操作。 例如,在 12 驱动器设置中,MinIO 将对象分片到 6 个数据驱动器和 6 个奇偶校验驱动器,并且可以可靠地写入新对象或重建现有对象,部署中只剩下 7 个驱动器 2.2 Bitrot 保护 静默数据损坏或比特腐烂是磁盘驱动器面临的一个严重问题,会导致数据在用户不知情的情况下损坏。 原因多种多样(驱动器老化、电流峰值、磁盘固件错误、幻写、误读/写入、驱动程序错误、意外覆盖)但结果是相同的 - 数据受损。 MinIO 对 HighwayHash 算法的优化实现确保它永远不会读取损坏的数据 - 它会即时捕获并修复损坏的对象。 通过在读取时计算散列并在写入时从应用程序、网络和内存/驱动器验证它,从端到端确保完整性。 该实现专为速度而设计,可以在 Intel CPU 的单核上实现超过 10 GB/秒的散列速度。 2.3 加密 在飞行中加密数据是一回事; 保护静态数据是另一回事。 MinIO 支持多种复杂的服务器端加密方案来保护数据——无论数据位于何处。 MinIO 的方法以可忽略的性能开销确保机密性、完整性和真实性。 使用 AES-256-GCM、ChaCha20-Poly1305 和 AES-CBC 支持服务器端和客户端加密。 加密对象使用 AEAD 服务器端加密进行防篡改。 此外,MinIO 与所有常用的密钥管理解决方案(例如 HashiCorp Vault)兼容并经过测试。 MinIO 使用密钥管理系统 (KMS) 来支持 SSE-S3。 如果客户端请求 SSE-S3,或者启用了自动加密,MinIO 服务器使用唯一的对象密钥加密每个对象,该对象密钥由 KMS 管理的主密钥保护。 鉴于极低的开销,可以为每个应用程序和实例打开自动加密。 2.4 蠕虫病毒 启用 WORM 后,MinIO 会禁用所有可能会改变对象数据和元数据的 API。 这意味着数据一旦写入就可以防篡改。 这对于许多不同的监管要求具有实际应用。 2.5 身份管理 MinIO 支持身份管理领域最先进的标准,与 OpenID connect 兼容提供商以及主要外部 IDP 供应商集成。这意味着访问是集中式的,密码是临时和轮换的,而不是存储在配置文件和数据库中。此外,访问策略是细粒度和高度可配置的,这意味着支持多租户和多实例部署变得非常简单。 2.6 连续复制 传统复制方法的挑战在于它们无法有效地扩展到几百 TiB 以上。 话虽如此,每个人都需要一个复制策略来支持灾难恢复,并且该策略需要跨越地域、数据中心和云。 MinIO 的连续复制专为大规模、跨数据中心部署而设计。 通过利用 Lambda 计算通知和对象元数据,它可以高效快速地计算增量。 Lambda 通知确保立即传播更改,这与传统的批处理模式不同。 连续复制意味着如果发生故障,数据丢失将保持在最低限度 - 即使面对高度动态的数据集。 最后,与 MinIO 所做的一切一样,连续复制是多供应商的,这意味着您的备份位置可以是从 NAS 到公共云的任何地方。 2.7 全球联盟 现代企业的数据无处不在。 MinIO 允许将这些不同的实例组合起来形成一个统一的全局命名空间。 具体来说,可以将任意数量的 MinIO 服务器组合成一个 Distributed Mode set,多个 Distributed Mode set 可以组合成一个 MinIO Server Federation。 每个 MinIO Server Federation 都提供统一的管理和命名空间。 MinIO 联合服务器支持无限数量的分布式模式集。 这种方法的影响是,对象存储可以为大型、地理分布的企业大规模扩展,同时保留从单个控制台容纳各种应用程序(Splunk、Teradata、Spark、Hive、Presto、TensorFlow、H20)的能力。 2.8 多云网关 所有企业都在采用多云战略。 这也包括私有云。 因此,您的裸机虚拟化容器和公共云服务(包括非 S3 提供商,如谷歌、微软和阿里巴巴)必须看起来完全相同。 虽然现代应用程序具有高度可移植性,但为这些应用程序提供支持的数据却并非如此。 让数据可用,无论它位于何处,是 MinIO 解决的主要挑战。 MinIO 在裸机、网络附加存储和每个公共云上运行。 更重要的是,MinIO 通过 Amazon S3 API 确保您对该数据的看法从应用程序和管理的角度来看完全相同。 MinIO,可以走得更远,使您现有的存储基础设施与 Amazon S3 兼容。 其影响是深远的。 现在,组织可以真正统一他们的数据基础设施 - 从文件到块,所有这些都显示为可通过 Amazon S3 API 访问的对象,而无需迁移。 3 Minio架构 MinIO 被设计为云原生,可以作为由外部编排服务(如 Kubernetes)管理的轻量级容器运行。 整个服务器是一个大约 40MB 的静态二进制文件,并且在使用 CPU 和内存资源方面非常高效 - 即使在高负载下也是如此。 结果是您可以在共享硬件上共同托管大量租户。 MinIO 在带有本地连接驱动器 (JBOD/JBOF) 的商用服务器上运行。 集群中的所有服务器都具有相同的能力(完全对称架构)。 没有名称节点或元数据服务器。 MinIO 将数据和元数据作为对象一起写入,从而消除了对元数据数据库的需求。 此外,MinIO 执行所有功能(擦除代码、位腐烂检查、加密)作为内联、严格一致的操作。 结果是 MinIO 非常有弹性。 每个 MinIO 集群都是分布式 MinIO 服务器的集合,每个节点有一个进程。 MinIO作为单进程运行在用户空间,使用轻量级协程实现高并发。 驱动器被分组为擦除集(默认情况下每组 16 个驱动器),并且使用确定性哈希算法将对象放置在这些集中。 MinIO 专为大规模、多数据中心的云存储服务而设计。 每个租户运行他们自己的 MinIO 集群,与其他租户完全隔离,使他们能够保护他们免受升级、更新和安全事件的任何中断。 每个租户通过跨地域联合集群独立扩展。 4 Windows安装 4.1 下载 下载地址:http://dl.minio.org.cn/server/minio/release/ 4.2 在minio.exe目录打开cmd 4.3 配置参数并启动 # 设置用户名 set MINIO_ACCESS_KEY=admin # 设置密码(8位) set MINIO_SECRET_KEY=admin123 # 指定启动端口(未指定默认9000)及存储位置 minio.exe server --address 0.0.0.0:9999 D:/data 4.4 登录地址IP+9999,输入用户名及密码,搭建完成 5 Linux安装 5.1 下载 5.2 创建相关目录 # 创建文件存储目录 mkdir -p /data/minio/data # 创建程序存放目录,并上传minio至此目录 mkdir -p /data/minio cd /data/minio # 修改可读权限 chmod +x minio # 设置用户名 export MINIO_ACCESS_KEY=admin # 设置密码 export MINIO_SECRET_KEY=admin123 5.3 启动并访问首页 ./minio server /data/minio/data --console-address ":33639" --address ":9000" 5.4 Docker docker run -p 9999:9000 -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin123" -v /data/minio:/data -d minio/minio server /data 5.5 Docker compose version: '3' services: minio: container_name: minio hostname: minio image: "minio/minio:latest" volumes: - /data/minio:/data ports: - "9999:9000" environment: MINIO_ACCESS_KEY: admin MINIO_SECRET_KEY: admin123 TZ: Asia/Shanghai command: server /data healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 30s timeout: 20s retries: 3 6 K8S 要点:使用yml文件配置资源,使用PVC存储minio文件 6.1 在节点 192.168.58.103创建NFS # 安装nfs-utils rpcbind yum install nfs-utils nfs-common rpcbind # 创建目录 mkdir -p /data/minio chmod 666 /data/minio/ chown nfsnobaby /data/minio/ # 添加访问策略 vi /etc/exports # 输入内容 /data/minio *(rw,no_root_squash,no_all_squash,sync) # 启动 systemctl start rpcbind systemctl start nfs # 查看 showmount -e 6.2 创建PV(master执行) # vim minio-pv.yaml # 添加 apiVersion: v1 kind: PersistentVolume metadata: name: pv-minio spec: capacity: storage: 2Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Recycle nfs: path: /data/minio server: 192.168.58.103 # 创建 kubectl create -f minio-pv.yaml # 查看 kubectl get pv -o wide 6.3 创建PVC(master执行) # vim minio-pvc.yaml # 内容 apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-minio spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi # 查看 kubectl get pvc -o wide 6.4 创建pod及service(master执行) # vim minio.yaml # 添加 apiVersion: v1 kind: Service metadata: name: minio-svc labels: app: minio spec: type: NodePort ports: - name: minio-port protocol: TCP port: 9000 nodePort: 32600 targetPort: 9000 selector: app: minio --- apiVersion: v1 kind: Pod metadata: name: minio labels: app: minio spec: containers: - name: minio env: - name: MINIO_ACCESS_KEY value: "admin" - name: MINIO_SECRET_KEY value: "admin123" image: minio/minio:latest args: - server - /data ports: - name: minio containerPort: 9000 volumeMounts: - name: data mountPath: /data volumes: - name: data persistentVolumeClaim: claimName: pvc-minio # 创建 kubectl apply -f minio.yaml # 查看pod kubectl get pods -o wide # 查看service kubectl get svc -o wide 6.5 验证 因为service采用的是NodePort,所以需要输入minio所在node的IP+32600访问 文件存放:页面上传一个文件,进入nfs所在服务器,然后发现文件已被存放在PVC中 ———————————————— 版权声明:本文为CSDN博主「吴名氏.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_37284798/article/details/132824064
-
多机部署LNMP是一个很重要的项目,L代表Linux系统,N代表Nginx服务, M代表Mysql服务,P代表PHP服务。LNMP平台应该是应用比较广泛的网站服务架构。随着Nginx在企业中的使用越来越多。LNMP架构也受到越来越多的linux系统工程师的青睐。因此,掌握多级部署LNMP是非常重要的。vim lnmp.sh#!/bin/bash#build lnmp#移除原有的yum仓库,并备份到/root/old目录下[-d /root/old] $$rm-rf /root/old;mkdir /root/old || mkdir /root/oldmv /etc/yum.repos.d/* /root/oldcp -r /root/old/*/etc/yum.repos.d/#更新安装epel源rpm -Uvh https://mirror.webtatic.com/yu,/e17/epel-release.rpmsleep 10#更新安装Centos源rpm -Uvh https://mirror.webtatic.com/yum/e17/webtatic-release.rpmyum clean allyum repolistsleep 10#安装依赖软件包yum -y install openssl-devel gcc-c++ gcc makeecho waiting install php......yum install -y php56w-fpm php56w-common pjp56w-mbstring php56w-mcrypt php56w-pdo php56w-mysqlnd php56w-bcmath php56w-xml php56w-ldap#修改相关配置sed -i 's/post_max_size=8M/post_max_size=16M/g' /etc/php.inised -i 's/max_execution_time=30/max_execution_time=300/g'/etc/php.inised -i 's/max_input_time=60/max_execution_time=300/g/etc/php.ini'sed -i 's/listen,allowed_clients=127.0.0.1/#listen.allowed_clients=127.0.0.1/g'/etc/php-fpm.d/www.conf#启动并设置开机自启动systemctl enable php-fpmsystemctl start pho-fpmsleep 10echo waiting for nginxyum -y install nginxnginx -tnginxsleep 10echo waiting for mysql15.6......[-d /usr/local/src]||mkdir -p /usr/local/srccd/usr/local/srcrpm -Uvh http://dev.mysql.com/get/mysql-community-release -e17-5.noarch.rpmyum repolist all |grep ''mysql.*-community.*''yum -y install mysql-community-serversystemctl enable mysqldsystemctl start mysqld.serviceecho $ip >> passwords.txtawk -F:'/temporary password""/{print $NF}' /var/log/mysqld.log>>passwords.txtsleep3以上是在一台服务器上实现部署LNMP,项目需求是要在多态服务器上实现,其思路和多级部署mysql一样,需要使用shell循环来实现多态机器的LNMP部署。vim ip.txt10.0.104.510.0.104.2710.0.104.3410.0.104.13610.0.104.108#!/bin/bash#mainwhile read ipdo{ping -c 1-w 2 $ ip>/dev/nullif [$?-eq 0];thenscp -r lnmp.sh root@ip:/tmp/ssh root@ip "/tmp/lnmp.sh"}&done <ip.txtwaitecho all finish以上代码是针对ip.txt文件中的主机ip地址进行多机部署LNMP。首先是先ping一下ip.txt文件中的ip地址,判断机器是否正常;然后把安装lnmp脚本复制到多态服务器上/tmp/下,远程使用管理员权限,执行安装LNMP脚本,如果显示 all finish 则表示所有服务器安装都已完成。
-
运维工程师(Operations)在国内又称为运维开发工程师(Devops),在国外称为 SRE(SiteReliability Engineering)。负责维护并确保整个服务的高可用性,同时不断优化系统架构、提升部署效率、优化资源利用率提高整体的ROI。作为工作几年的Linux运维老司机,总结了Linux命令行的常用的一些用法,希望对您有所收获。搜索在vi和vim中如果打开一个很大的文件,不容易找到对应的内容,可以使用自带的搜索关键字进行搜索定位:在vi和vim界面中输入:"/"(反斜杠),之后会出现一个输入框让你输入,当你输入的关键字在文件中存在就会以高亮的形式显示出来,之后按回车就确定定位到当前高亮位置,如果不是你要找的,则可以按:"n",意即寻找下一个输入关键字的内容。vim恢复以及乱码问题(1) 在vi和vim中如果不小心误删除了一些东西,想要恢复怎么办?首先要退出编辑状态,即按Esc键,之后再按u撤销之前的修改的内容。(2) 在用vi或vim打开一个文件的时候,如果有些地方出现一些特殊符号或是乱码,可以通过以下命令尝试:vim -b mytest.php(其中-b一般是用来查看对应的二进制文件的)管道命令,即竖杠-->'|'上面的意思是:将查询出来的内容交给管道后面的命令装饰之后再展示出来例如:cat install.log | more (more的意思是将一屏放不下的内容以分页的形式显示)ls -l /etc | more如果想看上一页的内容,可以通过:Shift + PageUp 来查看管道配合grep(过滤)可以达到很好用的组合例如:cat -n hello.txt | grep "hello" (查看hello.txt文件内容,并过滤出来带有hello的内容) ,-n 表示显示出来第几行的内容find 搜寻文件或目录find /home -name hello* (查找home目录下的文件名或目录为hello的)find / -name h?m* (在跟目录下查找h开头第二个字符是任意的,第三个是m,后面的是任意的字符)find / -size +1000000k (表示在根目录下查询文件大于1000000K的文件)5 字符串替换命令:s/well/good/替换当前行第一个well 为 good:s/well/good/g 替换当前行所有well 为 good:n,$s/well/good/ 替换第 n 行开始到最后一行中每一行的第一个 well 为 good:n,$s/well/good/g 替换第 n 行开始到最后一行中每一行所有 well 为 goodn 为数字,若 n 为 .,表示从当前行开始到最后一行:%s/well/good/ (等同于 :g/well/s//good/) 替换每一行的第一个 well 为 good:%s/well/good/g (等同于 :g/well/s//good/g) 替换每一行中所有 well 为 good特殊符号转义:可以使用#作为分隔符,此时中间出现的 / 不会作为分隔符:s#well/#good/# 替换当前行第一个 well/ 为 good/:%s#/usr/bin#/bin#g可以把文件中所有路径/usr/bin换成/bin6. 重定向命令ls -l /etc/ 希望ls -l /etc > /home/myback.txt (覆盖重定向)把显示的结果覆盖到/home/myback.txt中去ls -l /etc >> /home/myback.txt (追加重定向)把显示的结果追加到/home/myback.txt中去7. 删除多行删除多行步骤如下:首先要显示对应的行数这样方能知道从第几行到第几行删除: set nu按Esc键退出,在命令行中输入:190,6233d(即[190 , 6233]都删除掉)如果想要情况整个文件内容,在直接运行以下命令:清空文件内容:> log.txt8. 行位定位直接定位到最后一行:按Esc键退出,在命令行中输入:G直接定位到第一行:按Esc键退出,在命令行中输入:1 G直接定位到某一行:(第17行)按Esc键退出,在命令行中输入:17 G9. 复制一行或多行<1. 复制一行yy 复制当前行p 粘贴<2. 复制多行7yy 从当前行开始复制7行p 粘贴Linux中查看python的版本python -V或者python --versiongrep 的用法<1. 显示匹配的后n行 (after)grep -A n<2. 显示匹配的前n行 (before)grep -B n<3. 显示匹配的前后n行 (context)grep -C n<4. 忽略大小写grep -i strll或ls显示说明ll -ht (h会按照标准格式自动转换大小即:456M,1.2G等,t 表示显示内容按照时间倒序排列)应用案例:清空8月份的日志文件:rm -rf ll -ht | awk '/8月/ {print6,6,NF}' | awk '{print $NF}'说明:awk '/pattern/action'--> awk '/8月/{print6,6,NF}',只显示第六行与最后一行的内容且只保留8月的列表内容显示。ls中文件颜色的显示代表的意义为:1.蓝色--> 目录2.绿色--> 可执行文件3.红色--> 压缩文件4.浅蓝色--> 链接文件5.灰色--> 其他文件
-
身为一个运维开发人员,如果你不知道眼下当前服务器底层操作系统中正在发生什么,那就有点合眼摸象了。其实,你可以根据相应数据做出一定的推测,但是要做到这一点,就需要原始数据,并且数据要有一定的实时性。你需要能够根据操作系统当前的运行状态,结合监控数据来做出合理判断,采取相应措施。你是否曾经遇到过一台服务器运行缓慢,但是 CPU 使用率看起来不是很高的情况?你是否遇到过服务器的网络利用率很高,但是定位不到导致高网络利用率的进程情况?下面介绍的这些工具可以给你提供帮助。最重要的是,它们中的大多数都可以在没有 GUI 的情况下使用,并且能轻松安装在大多数服务器上。以下就是我每天用到的一些不错的 Linux 监控工具,它们可以帮助我快速准确地诊断和定位问题。1、iotop如果你想知道到底哪些进程消耗了服务器宝贵的 I/O 资源,那么请使用 iotop!我无数次地使用它通过 IOPS 参数来定位那些疯狂占用磁盘 IO 的耗时进程。图片你只是无法从传统工具(如 top)中获取原始数据。当使用 iotop 时,你会发现正如工具的名字所描述的一样,它会展示进程和系统的 I/O 资源使用情况。你可以将其用于多种目的,但最关键的是查看磁盘使用情况并标记潜在的性能瓶颈。将此工具与 top 或 htop 等其他工具结合使用,能帮你更全面地了解服务器当前负载情况。我不建议将 iotop 用于基准测试。尽管你能清楚地了解每个进程占用多少 I/O 资源,但它更适合实时监控而不是重复的性能测试。如果你对 I/O 基准测试感兴趣,我推荐一个名为 fio 的工具。2、htop这是我本人的最爱的监控工具之一。该工具比 top 工具更具视觉吸引力,并且拥有出色的默认配色方案。使用它,你就可以马上对系统当前运行情况有一个清晰了解。你能清晰地在水平条形图中查看计算机内核数目以及它们的利用率。同样的,你还可以获得内存使用情况的简单统计信息,并且在底部也有经典的 top 进程列表。我热衷于 htop 的主要原因是它能快速地提供我所关注的信息。我就是想看看服务器每核 CPU 使用率和内存使用率在图形上是怎样的 - 而不是一个无聊的百分比。如果你肯定某个进程正在耗尽系统上的所有核心从而打开 htop 进行查看,那么就会发现大片红色,整个过程快速而简单。
-
在 Linux 系统中,有两个常用的命令用于切换用户身份和执行特权操作,它们分别是 su 和 sudo。虽然它们都可以实现权限提升,但在使用方式、安全性和适用场景等方面存在一些区别。本文将介绍 su 和 sudo 命令的区别,以帮助用户正确选择和使用这两个命令。su 命令 su(切换用户)命令是在 Linux 系统中切换到其他用户身份的命令。通常,它需要超级用户(root)的密码才能切换到其他用户。使用 su 命令时,用户可以切换到其他用户的账户,并获得该账户的权限。例如,可以使用以下命令切换到超级用户(root):su在输入密码后,用户将切换到 root 用户,并获得 root 用户的权限。sudo 命令 sudo(以超级用户身份执行命令)命令是在 Linux 系统中以超级用户(root)的权限执行特定命令的命令。与 su 命令不同,sudo 命令允许普通用户以其自己的密码执行特权操作,而无需知道超级用户的密码。使用 sudo 命令时,用户需要在命令前加上 sudo 关键字,并输入自己的密码以确认身份。例如,以下命令将以超级用户的权限执行 apt-get update 命令:sudo apt-get update在输入密码后,用户将获得执行特权操作的权限。区别对比3.1 用户身份 su 命令需要超级用户(root)密码,用户可以切换到其他用户的身份并获得其权限。而 sudo 命令允许普通用户以其自己的密码执行特权操作。3.2 权限范围 su 命令切换到其他用户后,用户将获得该用户的全部权限。而 sudo 命令可以通过配置文件(sudoers 文件)控制特权操作的范围,可以精确指定用户可以执行哪些命令以及以哪些用户的身份执行。3.3 安全性 由于 su 命令需要共享 root 密码,这可能存在一些安全风险。如果其他人知道 root 密码,他们就可以切换到 root 用户,并拥有完全控制系统的权限。而 sudo 命令通过使用自己的密码来执行特权操作,可以避免共享 root 密码,提高系统的安全性。3.4 记录日志 sudo 命令会记录每个特权操作的日志,包括执行的命令和执行者的身份。这可以帮助系统管理员进行安全审计和追踪。而 su 命令没有内置的日志功能,无法追踪用户切换和执行的命令。3.5 使用方式 su 命令可以在命令行中直接输入,然后输入目标用户的密码即可切换用户。而 sudo 命令需要在命令前加上 sudo 关键字,然后输入自己的密码确认身份。适用场景 使用 su 命令切换用户适用于需要长时间以其他用户身份操作的情况,比如需要在其他用户的环境下执行一系列命令或长时间工作。 使用 sudo 命令适用于临时需要执行特权操作的情况,比如安装软件、更新系统或执行重要的系统维护任务。结论 su 命令和 sudo 命令是在 Linux 系统中用于切换用户身份和执行特权操作的常用命令。它们在使用方式、安全性和适用场景等方面存在一些区别。su 命令需要超级用户密码来切换用户身份,而 sudo 命令允许普通用户以自己的密码执行特权操作。使用 sudo 命令可以避免共享 root 密码和记录特权操作的日志,提高系统的安全性和可追踪性。在选择使用 su 命令或 sudo 命令时,需要根据具体需求和安全考虑来进行选择。希望本文对您了解 su 命令和 sudo 命令的区别有所帮助,并能在实际使用中正确选择和使用这两个命令。
-
历史上,shell一直是类Unix系统的本地命令行解释器。它已被证明是Unix的主要功能之一,并发展成为一个全新的主题。Linux提供了各种功能强大的shell,包括Bash、Zsh、Tcsh和Ksh。这些外壳最令人惊讶的特性之一是其可编程性。创建简单而有效的Linux shell脚本来处理日常工作非常容易。Hello World 程序员经常通过学习hello world程序来学习新语言。这是一个简单的程序,将字符串“HelloWorld”打印到标准输出中。然后,使用vim或nano等编辑器创建hello-world.sh文件,并将以下行复制到其中。#!/bin/bash echo "Hello World"保存并退出文件。接下来,您需要使用以下命令使该文件可执行。$ chmod a+x hello-world.sh 可以使用以下两个命令中的任何一个来运行此命令。$ bash hello-world.sh $ ./hello-world.sh 它将打印出传递给脚本内部回显的字符串。2.使用echo打印 echo命令用于在bash中打印信息。它类似于C函数“printf”,并提供了许多常见选项,包括转义序列和重定向。将以下行复制到名为echo.sh的文件中,并使其可执行,如上所述。#!/bin/bash echo "Printing text" echo -n "Printing text without newline" echo -e "\nRemoving \t special \t characters\n" 运行脚本以查看其功能。-e选项用于告诉echo传递给它的字符串包含特殊字符,需要扩展功能。3.使用注释 注释对文档很有用,是高质量代码库的要求。将注释放在处理关键逻辑的代码中是一种常见的做法。要注释掉一行,只需在其前面使用#(hash)字符。例如,请查看下面的bash脚本示例。#!/bin/bashAdding two values((sum=25+35))#Print the result echo $sum 此脚本将输出数字60。首先,在某些行之前使用#检查注释的使用方式。不过,第一行是一个例外。它被称为shebang,让系统知道在运行这个脚本时要使用哪个解释器。4.多行注释 许多人使用多行注释来记录他们的shell脚本。在下一个名为comment.sh的脚本中检查这是如何完成的。#!/bin/bash : ' This script calculates the square of 5. ' ((area=5*5)) echo $area 注意多行注释是如何放置在内部的:“和”字符。5.While循环 while循环构造用于多次运行某些指令。查看以下名为while.sh的脚本,以更好地理解此概念。#!/bin/bash i=0while [ $i -le 2 ] do echo Number: $i ((i++)) done 因此,while循环采用以下形式。while [ condition ] do commands 1 commands n done 方括号周围的空格是必填的。6.For循环 for循环是另一种广泛使用的bashshell构造,它允许用户高效地迭代代码。下面演示了一个简单的示例。#!/bin/bashfor (( counter=1; counter<=10; counter++ )) do echo -n "$counter " doneprintf "\n"7.接收用户输入 #!/bin/bashecho -n "Enter Something:" read somethingecho "You Entered: $something"8.If语句 if CONDITION then STATEMENTS fi 只有当条件为真时,才会执行这些语句。fi关键字用于标记if语句的结尾。下面显示了一个快速示例。#!/bin/bash echo -n "Enter a number: " read num if [[ $num -gt 10 ]] then echo "Number is greater than 10." fi 如果通过输入提供的数字大于10,上述程序将仅显示输出。-gt表示大于;类似地-lt表示小于-le表示小于等于;且-ge表示大于等于。此外,还需要[[]]。9.使用If Else进行更多控制 将else构造与if结合起来,可以更好地控制脚本的逻辑。下面显示了一个简单的示例。#!/bin/bashread n if [ $n -lt 10 ]; then echo "It is a one digit number" else echo "It is a two digit number" fi 其他部分需要放在if的动作部分之后和fi之前。10.使用AND运算符 AND运算符允许我们的程序检查是否同时满足多个条件。由AND运算符分隔的所有部分必须为true。否则,包含AND的语句将返回false。查看下面的bash脚本示例,以更好地了解AND的工作原理。#!/bin/bashecho -n "Enter Number:" read numif [[ ( $num -lt 10 ) && ( $num%2 -eq 0 ) ]]; then echo "Even Number" else echo "Odd Number" fi AND运算符由&&符号表示。11.使用OR运算符 OR运算符是另一个关键的构造,它允许我们在脚本中实现复杂、健壮的编程逻辑。与AND相反,当OR运算符的任一操作数为真时,由OR运算符组成的语句返回真。仅当由OR分隔的每个操作数为假时,它才返回假。#!/bin/bashecho -n "Enter any number:" read nif [[ ( $n -eq 15 || $n -eq 45 ) ]] then echo "You won" else echo "You lost!" fi 这个简单的示例演示了OR运算符如何在Linuxshell脚本中工作。只有当用户输入数字15或45时,它才会宣布用户为获胜者。||符号表示OR运算符。12.使用El if elif语句代表else if,并为实现链逻辑提供了一种方便的方法。通过评估以下示例,了解elif的工作原理。#!/bin/bashecho -n "Enter a number: " read numif [[ $num -gt 10 ]] then echo "Number is greater than 10." elif [[ $num -eq 10 ]] then echo "Number is equal to 10." else echo "Number is less than 10." fi 上面的程序是不言自明的,所以我们不会逐行剖析它。相反,更改脚本中的变量名称和值等部分,以检查它们如何一起工作。13.case 条件 switch构造是Linux bash脚本提供的另一个强大功能。它可以用于需要嵌套条件的地方,但不希望使用复杂的if-else elif链。看看下一个例子。#!/bin/bashecho -n "Enter a number: " read numcase $num in 100) echo "Hundred!!" ;; 200) echo "Double Hundred!!" ;; ) echo "Neither 100 nor 200" ;; esac 条件写在case和esac关键字之间。)用于匹配除100和200以外的所有输入。14.命令行参数 在许多情况下,直接从命令shell获取参数是有益的。下面的示例演示了如何在bash中执行此操作。#!/bin/bash echo "Total arguments : $#" echo "First Argument = $1" echo "Second Argument = $2" 运行此脚本时,在其名称后添加两个附加参数。我将其命名为test.sh,调用过程概述如下。$ ./test.sh Hey Howdy 因此,$1用于访问第一个参数,$2用于访问第二个参数,依此类推。最后,$#用于获取参数总数。15.使用名称获取参数 下面的示例显示了如何获取带有名称的命令行参数。#!/bin/bashfor arg in "$@" do index=$(echo $arg | cut -f1 -d=) val=$(echo $arg | cut -f2 -d=) case $index in X) x=$val;; Y) y=$val;; *) esac done ((result=x+y)) echo "X+Y=$result" 将此脚本命名为test.sh,并按如下所示调用它。$ ./test.sh X=44 Y=100它应该返回X+Y=144。这里的参数存储在“$@”中,脚本使用Linuxcut命令获取它们。16.连接字符串 字符串处理对于广泛的现代bash脚本来说非常重要。值得庆幸的是,它在bash中更加舒适,并允许以更精确、简洁的方式实现这一点。请参见下面的示例,了解bash字符串连接。#!/bin/bashstring1="Ubuntu" string2="Pit" string=$string1$string2 echo "$string is a great resource for Linux beginners."17.字符串截取 与许多编程语言不同,bash不提供任何用于剪切字符串部分的内置函数。然而,下面的示例演示了如何使用参数展开来实现这一点。#!/bin/bash Str="Learn Bash Commands from UbuntuPit" subStr=${Str:0:20} echo $subStr 该脚本应打印出“学习Bash命令”作为其输出。参数展开形式为${VAR_NAME:S:L}。这里,S表示起始位置,L表示长度。
-
一、uname:显示系统信息1、uname -a #显示系统所有相关信息图片2、uname -m #显示计算器的硬件架构图片3、uname -n #显示主机名称图片4、uname -r #显示内核发行版本号图片5、uname -s #显示内核名称图片6、uname -p #显示处理行类型图片7、uname -o #显示操作系统名称图片8、uanme -i #显示硬件平台图片二、hostname:显示或设置系统的主机名1、hostname #显示主机名图片2、hostname A #临时修改主机名,重启后失效图片3.vi /etc/hostname #永久修改主机名,重启后生效图片4、vi /etc/hosts #添加对主机名Mr.white的解析,第一行结尾添加图片图片5、hostname -I #获取系统IP地址,推荐使用,对应多块网卡的IP地址图片三、dmesg:系统启动异常诊断dmesg | less #查询内核缓冲区信息,用于查看硬件故障等信息图片图片四、stat:显示文件或文件系统状态1、stat /etc/hosts #查看系统信息图片2、stat -f /etc/hosts #查看文件系统属性图片五、du:统计磁盘空间使用情况1、du -a #显示所有目录或文件所占空间图片2、du -s #显示目录的总大小图片3、du -h #会换算成K/M/G的易读方式的结果图片4、du -sh # 当前目录总大小且易读展示图片5、du -h --max-depth=1 /usr/local/ #只显示第一层目录的大小图片du -h --max-depth=2 /usr/local/ #显示一二层目录的大小图片6、du -h --max-depth=2 /usr/local/ --exclude=/usr/local/share #显示一二层目录的大小,且排除指定目录 /usr/local/share图片六、date:显示与设置系统时间1、date +%y #显示年-短格式图片2、date +%Y #显示年-长格式图片 3、date +%m #显示月图片4、date +%d #显示日图片5、date +%H #显示小时图片6、date +%M #显示分钟图片7、date +%S #显示秒图片8、date +%F #显示特殊格式日期:年-月-日图片9、 date +%T #显示特殊格式日期:时-分-秒图片10、date +%F -d '-1day' #显示昨天,简洁图片11、date +%F -d 'yesterday' #显示昨天2图片12、date +%F -d '-1440min' #显示昨天3图片13、date +%F -d '+1day' #显示明天图片14、date +%F -d '+tomorrow' #显示明天2图片15、date +%F -d '24hour' #显示明天3图片16、date +%F -d '1440min' #显示明天4图片17、date +%F -d '+2day' #显示两天后图片18、date +%F -d '1month' #显示1个月后图片19、date +%F -d '1year' #显示1年后图片20、 date +%F -d '1year' #显示1年后图片21、date -d 'Thu Jul 6 21:41:16 CST 2017' '+%Y-%m-%d %H:%M:%S' #时间格式转换图片22、date -s 20201220 #设定系统时间,日期图片23、date -s '18:24:30 20201220' #设置全部时间图片24、date +%D%n%T #显示日期后换行显示时间图片七、echo:显示一行文本1、echo Hello world! #直接输出图片2、 echo 'Hello world!' #直接输出,引号括起来图片3、echo "hello world!" #双引号报错,!有特殊功能图片没有!可以正常输出图片4、echo "hello world"!#可以放在后面输出图片5、echo "hello world!" #可以转义输出图片6、echo -e "hello\tworld" #制表符输出图片7、echo -e "hello\nworld" #换行输出图片8、echo hello world >> hello.txt #重定位到文本内图片9、echo hello;echo world #分号可以连接两个命令图片10、echo -n hello;echo world #-n使两个输出不进行换行图片11、打印彩色输出:echo -e '\033[31m 红色字 mr.white trainning \033[0m'图片12、打印背景色设置:echo -e '\033[41;37m 红底白字 mr.white trainning \033[0m'图片13、echo $PATH #打印环境变量使用$美元符图片八、watch:监视命令执行情况1、watch -n 1 -d netstat -ant #-n每秒-d高亮显示网络链接数的变化图片2、watch cat test1220.txt #检测当前目录指定下文件的变化图片3、watch -t cat test1220.txt #检测当前目录指定下文件的变化,不显示标题图片九、which:显示命令的全路径1、which date #查看date命令的全路径图片2、which which #如果命令设置了别名,还会显示别名情况图片3、which java #显示java命令的全路径图片4、which -a java #显示所有包含java命令的路径图片十、whereis:显示命令及相关文件全路径1、whereis java #显示命令和文件图片2、whereis -b java #只查找可执行文件图片3、whereis -m java #只查找man帮助文件图片4、whereis -s java #只查找源代码文件,未找到图片十一、locate:快速定位文件路径安装mlocate:yum install mlocate图片1、locate pwd #查找文件的路径图片2、locate -c pwd #显示匹配的行数图片3、locate /etc/sh #只要部分符合就输出图片4、locate /etc/sh* #通配符查找图片5、locate /etc/sh #通配符查找2图片十二、updatedb:更新mlocate数据库updatedb可以初始化或更新locate命令使用的数据库,update定时任务固定每天执行1、初始化数据库:updatedb图片查看数据库与对应的定时任务图片2、更新数据库updatedb -vU /root/mytest20201219/ #v显示更新过程,U指定更新路径图片
-
量到远程主机的网络延迟的一种常用方法是使用ping应用程序。该ping工具依赖 ICMP ECHO 请求和回复数据包来测量远程主机的往返延迟。但是,在某些情况下,ICMP 流量可能会被防火墙阻止,这使得该ping应用程序对于受限制的防火墙后面的主机毫无用处。在这种情况下,你将需要依赖使用 TCP/UDP 数据包的第 3 层测量工具,因为这些第 3 层数据包更有可能绕过常见的防火墙规则。一种这样的第 3 层测量工具是tcpping. 为了测量延迟,tcpping利用所谓的半开放连接技术,基于 TCP 三路握手。也就是说,它通过端口号(默认为 80)向远程主机发送 TCP SYN 数据包。如果远程主机正在侦听该端口,它将以 TCP ACK 数据包响应。否则,它将以 TCP RST 数据包响应。无论哪种方式,tcpping都可以通过定时传出 SYN 数据包和传入 ACK(或 RST)数据包来测量远程主机的往返时间 (RTT) 延迟。在 Linux 上安装tcpping tcpping作为 shell 脚本实现,该脚本响应外部工具来执行和报告 RTT 测量。因此,为了安装tcpping,你首先需要先安装这些先决条件。安装依赖 tcptraceroute 要在 Ubuntu 或 Debian 上安装tcptraceroute:$ sudo apt-get install tcptraceroute要在 CentOS 或 RHEL 上安装tcptraceroute,首先在你的系统上设置 RepoForge,然后运行:$ sudo yum install tcptraceroute安装依赖 bc 使用的另一个工具tcpping是GNUbc,它预装在所有主要的 Linux 发行版上。但是,如果你tcpping在最小 Linux 运行时环境(例如Docker容器、AWS 最小映像 AMI)中运行,则bc可能不会预先安装。在这种情况下,你需要bc自己安装。在Debian 的 Linux 上安装:$ sudo apt-get install bc在 Red Hat 的 Linux 上安装:$ sudo yum install bc安装 tcpping 安装这些必备工具后,最后继续tcpping从官方源下载。$ wget cid:link_0$ cp tcpping /usr/bin$ chmod 755 tcpping使用tcpping来衡量延迟 要使用 测量网络延迟tcpping,你可以使用以下格式。tcpping [-d] [-c] [-r sec] [-x count] ipaddress [端口]-d: 在每个结果之前打印时间戳。-c: 使用分列输出以便于解析。-r:连续探测之间的间隔(以秒为单位)(默认为 1 秒)。-x: 重复 n 次(默认无限制)。[port]: 目标端口(默认为 80)。请注意,你需要 root 权限才能运行,tcpping因为它需要调用特权tcptraceroute命令。
-
ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, sockets, RAW sockets, Unix domain sockets等等统计. 它比其他工具展示等多tcp和state信息. 它是一个非常实用、快速、有效的跟踪IP连接和sockets的新工具.SS命令可以提供如下信息:所有的TCP sockets所有的UDP sockets所有ssh/ftp/ttp/https持久连接所有连接到Xserver的本地进程使用state(例如:connected, synchronized, SYN-RECV, SYN-SENT,TIME-WAIT)、地址、端口过滤所有的state FIN-WAIT-1 tcpsocket连接以及更多很多流行的Linux发行版都支持ss以及很多监控工具使用ss命令.熟悉这个工具有助于您更好的发现与解决系统性能问题.本人强烈建议使用ss命令替代netstat部分命令,例如netsat -ant/lnt等.展示他之前来做个对比,统计服务器并发连接数netstattime netstat -ant | grep EST | wc -l3100real 0m12.960s user 0m0.334s sys 0m12.561stime ss -o state established | wc -l3204real 0m0.030s user 0m0.005s sys 0m0.026s 结果很明显ss统计并发连接数效率完胜netstat,在ss能搞定的情况下, 你还会在选择netstat吗, 还在犹豫吗, 看以下例子,或者跳转到帮助页面.常用ss命令:ss -l 显示本地打开的所有端口 ss -pl 显示每个进程具体打开的socket ss -t -a 显示所有tcp socket ss -u -a 显示所有的UDP Socekt ss -o state established '( dport = :smtp or sport = :smtp )' 显示所有已建立的SMTP连接 ss -o state established '( dport = :http or sport = :http )' 显示所有已建立的HTTP连接 ss -x src /tmp/.X11-unix/* 找出所有连接X服务器的进程 ss -s 列出当前socket详细信息:显示sockets简要信息,列出当前已经连接,关闭,等待的tcp连接ss -sTotal: 3519 (kernel 3691) TCP: 26557 (estab 3163, closed 23182, orphaned 194, synrecv 0, timewait 23182/0), ports 1452Transport Total IP IPv63691 - - RAW 2 2 0 UDP 10 7 3 TCP 3375 3368 7 INET 3387 3377 10 FRAG 0 0 0列出当前监听端口ss -lRecv-Q Send-Q Local Address:Port Peer Address:Port0 10 :::5989 :::* 0 5 :rsync : 0 128 :::sunrpc ::: 0 128 :sunrpc : 0 511 :http : 0 128 :::ssh ::: 0 128 :ssh : 0 128 :::35766 ::: 0 128 127.0.0.1:ipp : 0 128 ::1:ipp ::: 0 100 ::1:smtp :::* 0 100 127.0.0.1:smtp : 0 511 :https : 0 100 :::1311 ::: 0 5 *:5666 : 0 128 *:3044 :ss列出每个进程名及其监听的端口ss -plss列所有的tcp socketsss -t -ass列出所有udp socketsss -u -ass列出所有http连接中的连接ss -o state established '( dport = :http or sport = :http )'·以上包含对外提供的80,以及访问外部的80·用以上命令完美的替代netstat获取http并发连接数,监控中常用到ss列出本地哪个进程连接到x serverss -x src /tmp/.X11-unix/*ss列出处在FIN-WAIT-1状态的http、https连接ss -o state fin-wait-1 '( sport = :http or sport = :https )'ss常用的state状态:established syn-sent syn-recv fin-wait-1 fin-wait-2 time-wait closed close-wait last-ack listen closingbig : Opposite to bucket state.ss使用IP地址筛选ss src ADDRESS_PATTERN src:表示来源 ADDRESS_PATTERN:表示地址规则 如下: ss src 120.33.31.1 # 列出来之20.33.31.1的连接# 列出来至120.33.31.1,80端口的连接 ss src 120.33.31.1:http ss src 120.33.31.1:8ss使用端口筛选ss dport OP PORT OP:是运算符 PORT:表示端口 dport:表示过滤目标端口、相反的有sportOP运算符如下:<= or le : 小于等于 >= or ge : 大于等于 == or eq : 等于 != or ne : 不等于端口 < or lt : 小于这个端口 > or gt : 大于端口OP实例ss sport = :http 也可以是 ss sport = :80 ss dport = :http ss dport > :1024 ss sport > :1024 ss sport < :32000 ss sport eq :22 ss dport != :22 ss state connected sport = :http ss ( sport = :http or sport = :https ) ss -o state fin-wait-1 ( sport = :http or sport = :https ) dst 192.168.1/24为什么ss比netstat快:netstat是遍历/proc下面每个PID目录,ss直接读/proc/net下面的统计信息。所以ss执行的时候消耗资源以及消耗的时间都比netstat少很多ss命令帮助ss -hUsage: ss [ OPTIONS ] ss [ OPTIONS ] [ FILTER ] -h, --help this message -V, --version output version information -n, --numeric don't resolve service names -r, --resolve resolve host names -a, --all display all sockets -l, --listening display listening sockets -o, --options show timer information -e, --extended show detailed socket information -m, --memory show socket memory usage -p, --processes show process using socket -i, --info show internal TCP information QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]-D, --diag=FILE Dump raw information about TCP sockets to FILE -F, --filter=FILE read filter information from FILE FILTER := [ state TCP-STATE ] [ EXPRESSION ]
-
内存管理的主要工作就是对物理内存进行组织,然后对物理内存的分配和回收。但是Linux引入了虚拟地址的概念。虚拟地址的作用 如果用户进程直接操作物理地址会有以下的坏处: 1、 用户进程可以直接操作内核对应的内存,破坏内核运行。 2、 用户进程也会破坏其他进程的运行 CPU 中寄存器中存储的是逻辑地址,需要进行映射才能转化为对应的物理地址,然后获取对应的内存。 通过引入逻辑地址,每个进程都拥有单独的逻辑地址范围。 当进程申请内存的时候,会为其分配逻辑地址和物理地址,并将逻辑地址和物理地址做一个映射。 所以,Linux内存管理涉及到了以下三个部分: 1、物理内存 物理内存的组织 Linux 中内存分为 3 个级别,从下到上依次为: 1、Page: 一个 page 的大小为 4k, Page 是内存的一个最基本的单位。 2、Zone: Zone 中提供了多个队列来管理 page。 Zone分为 3 种 2.1、 ZONE_DMA:用来存放 DMA 读取 IO 设备的数据,内核专用 2.2、 ZONE_NORMAL:用来存放内核的相关数据,内核专用 2.3、 ZONE_HIGHMEM:高端内存,用来存放用户进程数据 3、Node 节点,一个 CPU 对应着一个 Node,一个 Node 包括一个 Zone_DMA、 ZONE_NORMAL、ZONE_HIGHMEM。 同时当一个 CPU 对应的内存用光后,可以申请其他 CPU 对应的内存。 图片物理内存的分配 Linux将内存分配分为两种: 1、大内存 大内存 利用伙伴系统 分配。 图片 伙伴系统的做法是将 ZONE 中的 Page 分组,然后组装为多个链表。链表中存放的是 页块 的集合。页块对应着有不同的大小,分别为 1、2、4、8 … 1024个页。 当请求 (2i-1 ,2i] 大小的 page 的时候,会直接请求 2i 个页, 如果对应的链表中有对应的页块,就直接分配。如果对应的链表没有,就往上找 2i+1,如果 2i+1 存在,就将其分为 2 个 2i 页块,将其中 1 个 2i 加入到对应的链表中,将另外一个分配出去。 例如,要请求一个 128 个页的页块时,先检查 128 个页的页块链表是否有空闲块。如果没有,则查 256 个 的页块链表;如果有空闲块的话,则将 256 个页的页块分成两份,一份使用,一份插入 128 个页的页块链表中。如果还是没有,就查 512 个页的页块链表;如果有的话,就分裂为 128、128、256 三个页块,一个 128 的使用,剩余两个插入对应页块链表。 2、小内存分配 小内存分配利用 slub 分配,比如对象等数据 slub 就是 将几个页单独拎出来作为缓存,里面维护了链表。每次直接从链表中获取对应的内存,用完之后也不用清空,就直接挂到链表上,然后等待下次利用。 图片 2、如何组织虚拟地址 虚拟地址对应的是虚拟空间,虚拟空间只不过是一个虚拟地址的集合,用来映射物理内存。图片虚拟空间分为 用户态 和 内核态 。 32位系统中 将虚拟空间按照 1:3 的比例分配给 内核态 和 用户态。 64位系统中 分别给 内核态 和 用户态 分配了 128T。 用户态结构 图片每个进程 都会 对应一个 用户态虚拟空间, 里面存放了 Text(代码)的内存虚拟地址范围、 Data(数据)的内存虚拟地址范围、BSS(全局变量)的内存虚拟地址范围、堆的虚拟地址范围、栈的虚拟地址范围,以及mmap 内存映射区。 其中 mmap 用于申请动态内存的时候的映射,堆和栈都是动态变化的。 一个进程对应的用户态中的 各个方面的虚拟地址信息都通过一个 struct 来存储在内存中,当创建进程的时候会为其分配内存存储对应的虚拟地址信息。 内核态结构 图片 Linux 的内核程序共用一个内核态虚拟空间。其中分为了以下几部分: 1、直接映射区 896M,内核空间直接映射到对应的ZONE_DMA和ZONE_NORMAL中。为什么叫做直接映射呢?逻辑地址 直接 减去对应的差值就可以得到对应的物理地址。固定死了。 2、动态映射 为什么要引入动态映射呢?因为所有物理内存的分配都需要内核程序进行申请,用户进程没有这个权限。所以内核空间一定要能映射到所有的物理内存地址。 那么如果都采用直接映射的话,1G大小逻辑地址的内核空间只能映射1G大小的物理内存。 所以引入了动态映射,动态映射就是 内核空间的逻辑地址可以映射到 物理内存中的ZONE_HIGHMEM(高端内存)中的任何一个地址,并且在对应的物理内存使用完之后,可以再映射其他物理内存地址。原文:cid:link_0
-
2.1 procfs文件系统 ProcFs 介绍procfs 是比较老的一种用户态与内核态的数据交换方式, 内核的很多数据都是通过这种方式出口给用户的, 内核的很多参数也是通过这种方式来让用户方便设置的. 除了 sysctl 出口到 /proc 下的参数, procfs 提供的大部分内核参数是只读的. 实际上, 很多应用严重地依赖于procfs, 因此它几乎是必不可少的组件. 前面部分的几个例子实际上已经使用它来出口内核数据, 但是并没有讲解如何使用, 本节将讲解如何使用procfs.参考资料:用户空间与内核空间数据交换的方式(2)——procfs2.2 sysfs文件系统 内核子系统或设备驱动可以直接编译到内核, 也可以编译成模块, 编译到内核, 使用前一节介绍的方法通过内核启动参数来向它们传递参数, 如果编译成模块, 则可以通过命令行在插入模块时传递参数, 或者在运行时, 通过 sysfs 来设置或读取模块数据.Sysfs 是一个基于内存的文件系统, 实际上它基于ramfs, sysfs 提供了一种把内核数据结构, 它们的属性以及属性与数据结构的联系开放给用户态的方式, 它与 kobject 子系统紧密地结合在一起, 因此内核开发者不需要直接使用它, 而是内核的各个子系统使用它. 用户要想使用 sysfs 读取和设置内核参数, 仅需装载 sysfs 就可以通过文件操作应用来读取和设置内核通过 sysfs 开放给用户的各个参数:mkdir -p /sysfs mount -t sysfs sysfs /sysfs 注意, 不要把 sysfs 和 sysctl 混淆, sysctl 是内核的一些控制参数, 其目的是方便用户对内核的行为进行控制, 而 sysfs 仅仅是把内核的 kobject 对象的层次关系与属性开放给用户查看, 因此 sysfs的绝大部分是只读的, 模块作为一个 kobject 也被出口到 sysfs, 模块参数则是作为模块属性出口的, 内核实现者为模块的使用提供了更灵活的方式, 允许用户设置模块参数在 sysfs 的可见性并允许用户在编写模块时设置这些参数在 sysfs 下的访问权限, 然后用户就可以通过 sysfs 来查看和设置模块参数, 从而使得用户能在模块运行时控制模块行为.相关资料链接:用户空间与内核空间数据交换的方式(6)——模块参数与sysfs2.3 debugfs文件系统 内核开发者经常需要向用户空间应用输出一些调试信息, 在稳定的系统中可能根本不需要这些调试信息, 但是在开发过程中, 为了搞清楚内核的行为, 调试信息非常必要, printk可能是用的最多的, 但它并不是最好的, 调试信息只是在开发中用于调试, 而 printk 将一直输出, 因此开发完毕后需要清除不必要的 printk 语句, 另外如果开发者希望用户空间应用能够改变内核行为时, printk 就无法实现.因此, 需要一种新的机制, 那只有在需要的时候使用, 它在需要时通过在一个虚拟文件系统中创建一个或多个文件来向用户空间应用提供调试信息.有几种方式可以实现上述要求:使用 procfs, 在 /proc 创建文件输出调试信息, 但是 procfs 对于大于一个内存页(对于 x86 是 4K)的输出比较麻烦, 而且速度慢, 有时回出现一些意想不到的问题.使用 sysfs( 2.6 内核引入的新的虚拟文件系统), 在很多情况下, 调试信息可以存放在那里, 但是sysfs主要用于系统管理,它希望每一个文件对应内核的一个变量,如果使用它输出复杂的数据结构或调试信息是非常困难的.使用 libfs 创建一个新的文件系统, 该方法极其灵活, 开发者可以为新文件系统设置一些规则, 使用 libfs 使得创建新文件系统更加简单, 但是仍然超出了一个开发者的想象.为了使得开发者更加容易使用这样的机制, Greg Kroah-Hartman 开发了 debugfs(在 2.6.11 中第一次引入), 它是一个虚拟文件系统, 专门用于输出调试信息, 该文件系统非常小, 很容易使用, 可以在配置内核时选择是否构件到内核中, 在不选择它的情况下, 使用它提供的API的内核部分不需要做任何改动.2.4 relayfs文件系统 relayfs 是一个快速的转发(relay)数据的文件系统, 它以其功能而得名. 它为那些需要从内核空间转发大量数据到用户空间的工具和应用提供了快速有效的转发机制.Channel 是 relayfs 文件系统定义的一个主要概念, 每一个 channel 由一组内核缓存组成, 每一个 CPU 有一个对应于该 channel 的内核缓存, 每一个内核缓存用一个在 relayfs 文件系统中的文件文件表示, 内核使用 relayfs 提供的写函数把需要转发给用户空间的数据快速地写入当前 CPU 上的 channel 内核缓存, 用户空间应用通过标准的文件 I/ O函数在对应的 channel 文件中可以快速地取得这些被转发出的数据 mmap 来. 写入到 channel 中的数据的格式完全取决于内核中创建channel 的模块或子系统.relayfs 的用户空间API :relayfs 实现了四个标准的文件 I/O 函数, open、mmap、poll和close
-
CPU 上下文切换是保证 Linux 系统正常运行的核心功能。可分为进程上下文切换、线程上下文切换和中断上下文切换。 在本文中,我将进一步讨论如何分析 CPU 上下文切换问题。 检查 CPU 的上下文切换 我们知道,过多的上下文切换会消耗 CPU 的时间来保存和恢复寄存器、程序计数器、内核栈和虚拟内存等数据,从而导致系统性能显着下降。 既然上下文切换对系统性能的影响如此之大,那么我们如何检查它呢?好了,你可以使用 vmstat 工具来查询你系统的上下文切换。 vmstat vmstat 是一种常用的系统性能分析工具。主要用于分析内存使用情况,也常用于分析 CPU 上下文切换和中断的次数。 例如 vmstat 5(5 秒输出间隔): 图片 让我们看一下输出: cs(context switch):每秒上下文切换的次数。 in(interrupt):每秒的中断数。 r(running | runnable):就绪队列的长度,即正在运行和等待 CPU 的进程数。 b(blocked):处于不间断睡眠状态的进程数。 在上面的例子中,我们可以看到上下文切换次数为 33 次,系统中断次数为 25 次,就绪队列长度,不间断状态进程数均为 0。 pidstat vmstat 工具只给出了系统的整体上下文切换的信息。要查看每个进程的详细信息,您需要使用 pidstat。添加 -w 选项,您可以看到每个进程的上下文切换: 例如:Output interval is 5$ pidstat -w 5 Linux 4.15.0 (ubuntu) 09/23/18 x86_64 (2 CPU) 08:18:26 UID PID cswch/s nvcswch/s Command 08:18:31 0 1 0.20 0.00 systemd 08:18:31 0 8 5.40 0.00 rcu_sched ... 结果中有两列需要我们注意:cswch 和 nvcswch。其中,cswch 表示每秒自愿上下文切换的次数,nvcswch 表示每秒非自愿上下文切换的次数。 自愿上下文切换:指进程无法获得所需资源而导致的上下文切换。例如,当 I/O 和内存等系统资源不足时,就会发生自愿上下文切换。 非自愿上下文切换:指进程因时间片已过期而被系统强制重新调度时发生的上下文切换。例如,当大量进程竞争 CPU 时,很容易发生非自愿的上下文切换。 您必须牢记这两个概念,因为它们意味着不同的性能问题。 案例分析 既然您知道如何查看这些指标,那么就会出现另一个问题,上下文切换频率多久才是正常的呢?让我们看一个示例案例。 我们将使用 ,一个多线程的基准测试工具通过生成负载来模拟上下文切换过多的问题。假设您已经在 Linux 系统上安装了 sysbench 和 sysstat。 在我们模拟负载之前,让我们在一个终端中运行一下 vmstat: 图片 在这里可以看到当前的上下文切换次数 cs 是 35,中断次数 in 是 19,r 和 b 都是 0。由于我目前没有其他任务在运行,因此它们是空闲系统中的上下文切换数量。 现在让我们运行 sysbench 来模拟多线程调度系统的瓶颈: $ sysbench --threads=10 --max-time=300 threads run 现在,您应该会看到 vmstat 输出了与上面不同的结果: 图片 应该可以发现 cs 栏的上下文切换次数从之前的 35 次突增到 139 万次。同时,注意观察其他几个指标: r:就绪队列的长度已达到 8 us 和 sy:us 和 sy 的 CPU 使用率加起来是 100%,系统 CPU 使用率是 84%,说明 CPU 主要被内核占用。 in:中断数也上升到了 10000,说明中断处理也是一个潜在的问题。 结合这些指标我们可以知道系统的就绪队列太长了,也就是有太多的进程在运行等待 CPU,导致大量的上下文切换,而大量的上下文切换导致了系统 CPU 使用率的增长。那么是什么过程导致了这些问题呢? 我们继续分析,同时在第三个终端使用 pidstat,看看 CPU 和进程上下文切换的情况:1 means output interval is 1 second-w: output process switching index,-u: output CPU usage index$ pidstat -w -u 1 08:06:33 UID PID %usr %system %guest %wait %CPU CPU Command 08:06:34 0 10488 30.00 100.00 0.00 0.00 100.00 0 sysbench 08:06:34 0 26326 0.00 1.00 0.00 0.00 1.00 0 kworker/u4:2 08:06:33 UID PID cswch/s nvcswch/s Command 08:06:34 0 8 11.00 0.00 rcu_sched 08:06:34 0 16 1.00 0.00 ksoftirqd/1 08:06:34 0 471 1.00 0.00 hv_balloon 08:06:34 0 1230 1.00 0.00 iscsid 08:06:34 0 4089 1.00 0.00 kworker/1:5 08:06:34 0 4333 1.00 0.00 kworker/0:3 08:06:34 0 10499 1.00 224.00 pidstat 08:06:34 0 26326 236.00 0.00 kworker/u4:2 08:06:34 1000 26784 223.00 0.00 sshd 从 pidstat 的输出可以发现,CPU 使用率的增加确实是 sysbench 造成的,它的 CPU 使用率已经达到了 100%。但上下文切换来自其他进程,包括非自愿上下文切换频率最高的 pidstat,以及自愿上下文切换频率最高的内核线程 kworker 和 sshd。 注意:默认情况下 pidstat 只显示进程的上下文切换,如果要查看实际线程的上下文切换,请添加 -t 选项。 中断 要找出中断数量也很高的原因所在,您可以检查 /proc/interrupts 文件。该文件会提供一个只读的中断使用情况。-d: Highlight the change area$ watch -d cat /proc/interrupts CPU0 CPU1 ... RES: 2450431 5279697 Rescheduling interrupts ... 观察一段时间后,可以发现变化最快的是重新调度中断(RES, REScheduling interrupt)。这种中断类型表明处于空闲状态的 CPU 被唤醒以调度新的任务运行。所以这里的中断增加是因为太多的任务调度问题,这和前面上下文切换次数的分析结果是一致的 现在回到最初的问题,每秒多少次上下文切换是正常的? 这个值实际上取决于系统本身的 CPU 性能。在我看来,如果系统的上下文切换次数比较稳定的话,几百到一万应该是正常的。但是,当上下文切换次数超过 10000,或者切换次数快速增加时,很可能是出现了性能问题。 结论 此时,你应该可以根据上下文切换的类型做一些具体的分析了。 自愿上下文切换较多,说明进程在等待资源,可能会出现 I/O 饱和等其他问题。 非自愿上下文切换较多,说明进程正在被强制调度,也就是都在争抢 CPU,说明 CPU 确实产生了瓶颈。 中断次数增多,说明 CPU 被中断处理程序占用,需要通过查看 /proc/interrupts 文件来分析具体的中断类型。
-
linux 是一个开源、免费的操作系统 ,其稳定性、安全性 、处 理多并发已经得到业界的认可,目前很多中型,大型甚 至是集群项 目都在使用 linux, 很多软件公司考虑到开发成本 都首 选 linux, 在中国软件公司得到广泛的使用 。 近些年来linux在嵌入式领域的应用得到了飞速的提高linux 运行稳定、对网络的良好支持性、低成本,且可以根据需要进行软件裁剪,内核最小可以达到几百KB 等特点,使其近些年来在嵌入式领域的应用得到非常大的提高主要应用:机顶盒、数字电视、网络电话、程控交换机、手机、PDA、智能家居、智能硬件等都是其应用领域。以后再物联网中应用会更加广泛。我认为学习 linux 流程: 第1 阶段 : linux环境下的基本操作命令,包括 文件操作命令(rm mkdir chmod, chown) 编辑工具使用(vi vim)linux用户管理(useradd userdel usermod)等第2 阶段 : linux的各种配置(环境变量配置,网络配置,服务配置)第3 阶段 : linux下如何搭建对应语言的开发环境(大数据,JavaEE, Python等)第4 阶段 : 能编写shell脚本,对Linux服务器进行维护。第5 阶段 : 能进行安全设置,防止攻击,保障服务器正常运行,能对系统调优。第6 阶段 : 深入理解Linux系统(对内核有研究),熟练掌握大型网站应用架构组成、并熟悉各个环节的部署和维护方法。一些基本的指令:(1)cd命令cd :切换目录用法:cdcd ../ 切换到上级目录cd / 切换到根目录cd ~ (或只有cd )切换到当前用户主目录(home底下以用户名命名的文件夹) /root目录mkdir 创建目录mkdir 目录名 -p 递归创建目录(2)rm删除文件用法:rmdir 目录名也可用:rm -rf 目录名(3)ls命令查看目录或文件信息主要选项:-l 列出目录或者文件的详细信息。比如权限、修改时间等等-a 列出当前目录下所有文件,包括隐藏文件(已点开头的都是隐藏文件)(4)万能文本编辑vi/vim命令i 进入编辑状态退出编辑按ESC键不保存退出: :q!保存退出: :wq输入/,进入搜索输入:set nu,显示每一行的行数按键盘G,可以直接定位到最末尾(5)cp复制和mv移动命令用法:cp [选项]文件名或目录 目标地址-R 拷贝目录及目录下所有目录和文件cp a.txt b.txt #将a文件复制,且另命名为b文件(目录名)(6)| 管道符 (竖线,英文输入法状态下shift+键盘上的的|\)在命令之间建立管道,将前面命令的输出作为后面命令的输入#通过命令查找tomcat进程 ps -ef | grep tomcat #通过命令查找到占用此端口的进程编号 netstat -apn|grep 3306(7)tar 解压,压缩tar.gz#将test文件夹压缩成 tar -czvf test.tar.gz test #将test.tar.gz解压得到test文件夹 test.tar.gztar -xzvf test.tar.gz(8)zip 解压,压缩zip#将test文件夹压缩成test.zip,必须带r 才会把文件压缩进去,不然会生成一个空的文件夹 zip –r test.zip test #将test.zip文件夹解压 unzip test.zip(9)关闭防火墙#开启 service iptables start #关闭 service iptables stop永久关闭防火墙#开启 chkconfig iptables on #关闭 chkconfig iptables off
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签