2025年高级运维工程师的副业攻略

2025年高级运维工程师的四大副业方向经典案例及实操步骤 – LinuxGuideLinuxGuide

以下是针对2025年高级运维工程师的副业攻略,结合技术趋势和市场需求,分类整理出高潜力方向,并附实操建议与风险提示:


⚙️ ​​一、技术变现类副业​​(核心技能直接转化)

  1. ​云服务迁移与优化​
    • ​操作​​:为企业提供AWS/Aliyun迁移方案,利用Terraform、K8s设计高可用架构,优化云成本(节省费用分成模式)。
    • ​收益​​:单项目5k-3w+,长期优化分成可达年10w+。
    • ​启动建议​​:考取云厂商认证(如AWS解决方案架构师),入驻“程序员客栈”接单。
  2. ​网络安全服务​
    • ​渗透测试​​:用BurpSuite、Nmap做漏洞扫描,按次收费(高危漏洞报告单次3k-1.5w)。
    • ​合规审计​​:协助企业通过等保2.0/ISO27001认证,签订年框顾问协议。
    • ​风险提示​​:需获得授权,避免法律风险;持有CISP/Pentest+证书提升信任度。
  3. ​运维自动化产品开发​
    • ​开发工具​​:用Python编写巡检脚本、监控平台,GitHub开源引流后推出企业付费版(SaaS订阅制)。
    • ​案例​​:自动化部署工具包可定价500-5000元/授权,或年费制。
  4. ​远程基础设施代维​
    • ​服务内容​​:通过Zabbix/ELK监控企业服务器,处理备份、故障恢复(包月制)。
    • ​渠道​​:在“码市”平台承接代维订单,月收入3k-8k+。

📚 ​​二、知识付费类副业​​(经验沉淀变现)

  1. ​技术课程开发​
    • ​方向​​:在慕课网/极客时间开设《K8s实战》《DevOps自动化》课程,单课售价199-999元,分成70%。
    • ​技巧​​:结合实战案例(如某企业迁移故障复盘)提升吸引力。
  2. ​技术内容创作​
    • ​运营矩阵​​:公众号写深度文章(如《2025云原生监控新趋势》),引流至知识星球(年费299元/人)。
    • ​变现​​:广告+付费专栏+企业合作(单篇爆文引流可达5k+粉丝)。
  3. ​一对一咨询​
    • ​平台​​:入驻“在行”,提供中小企业架构优化咨询(500元/小时)。

🚀 ​​三、轻资产创业类副业​​(资源整合型)

  1. ​技术猎头与内推​
    • ​操作​​:利用LinkedIn人脉为大厂内推运维人才,成功入职后推荐费5k-3w/人。
  2. ​IT设备评测带货​
    • ​方向​​:在B站/抖音评测NAS、企业级路由器,挂京东联盟链接分佣(单视频收益1k-5k+)。
  3. ​开源项目商业化​
    • ​路径​​:维护GitHub高Star工具(如自动化脚本库),推出企业定制版(年费1w+)或接受捐赠。

🔮 ​​四、创新融合类副业​​(新兴领域结合)

  1. ​区块链节点运维​
    • ​服务​​:为Web3项目部署主节点,收益=技术服务费+代币奖励(月均1w+)。
  2. ​电竞网络优化​
    • ​客户​​:电竞战队/直播平台,提供低延迟架构设计,分赛事保障费+硬件销售佣金。

⚠️ ​​关键风险与效率策略​

  1. ​合规红线​​:
    • 禁止未授权渗透测试,避免触碰数据隐私法。
  2. ​时间管理​​:
    • 副业时长≤主业30%,用自动化脚本(如Ansible)提升效率。
  3. ​冷启动技巧​​:
    • 从低门槛切入:先做远程运维→积累案例→开发课程→出书。

💎 ​​2025年趋势预测​

  • ​高潜力赛道​​:云成本优化(企业上云加速)、AI运维(LLM结合告警分析)、区块链节点维护(Web3普及)。
  • ​避坑方向​​:重资产硬件代理(仓储成本高)、纯体力型代维(时薪<80元)。

副业本质是技术价值的延伸,选择与主业协同度高的方向(如云架构师→云迁移顾问),既能降低学习成本,又可复用客户资源。初期建议聚焦1-2个方向,跑通闭环后再横向扩展。

2025年高级运维工程师的四大副业方向经典案例及实操步骤 – LinuxGuideLinuxGuide

发表在 linux文章 | 留下评论

Linux磁盘管理命令-xfs 管理命令

在 GNU/Linux 中,管理 XFS 的工作主要使用 xfsprogs 中的一系列工具。
xfsdump – Administrative utilities for the XFS filesystem
xfslibs-dev – XFS filesystem-specific static libraries and headers
xfsprogs – Utilities for managing the XFS filesystem

1.命令说明
mkfs.xfs: 创建 XFS 文件系统。
xfs_admin: 调整 XFS 文件系统的各项参数。
xfs_copy: 复制 XFS 文件系统的内容到一个或多个目标系统(并行方式)。
xfs_db: 调试或检测 XFS 文件系统(查看文件系统碎片等)。
xfs_check: 检测 XFS 文件系统的完整性。
xfs_bmap: 查看一个文件的块映射。
xfs_repair:尝试修复受损的 XFS 文件系统。
xfs_fsr: 碎片整理。
xfs_quota: 管理 XFS 文件系统的磁盘配额。
xfs_metadump:将 XFS 文件系统的元数据(Metadata)复制到一个文件中。
xfs_mdrestore:从一个文件中将元数据(Metadata)恢复到 XFS 文件系统。
xfs_growfs:调整 XFS 文件系统的大小(只能扩展)。
xfs_freeze:暂停(-f)和恢复(-u)XFS 文件系统。

2.建立 XFS 文件系统
1)格式化

要格式化存储设备为 XFS 格式,可以用 root 身份执行如下命令:

mkfs -t xfs /dev/sdb5

如果 mkfs.xfs 发现存储设备仍有之前存放的文件资料,则会拒绝进行格式化。

mkfs.xfs /dev/sdb5

mkfs.xfs: /dev/sdb5 appears to contain an existing filesystem (xfs).

mkfs.xfs: Use the -f option to force overwrite.
如果确定那些资料已没有用处,需要为 mkfs.xfs 加上选项 -f 强迫它进行格式化。

磁盘挂载正在使用无法格式化,需先卸载再执行格式化;

mkfs.xfs -f /dev/sdb5

meta-data =/dev/sdb5 isize=256 agcount=4,agsize=524119 blks
= sectsz=512 attr=2
data = bsize=4096 blocks=2096474,imaxpct=25

= sunit=0s width=0 blks
naming =version 2 bsize=4096
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=0
realtime =none extsz=4096 blocks=0, rtextents=0
2)区块大小(Block size)
区块(Block)是文件系统存储盘中内容最小的单位,其大小对文件系统的空间运用和效 用有很大的影响。
较大的区块可以令文件系统大小上限和文件大小上限增加,也可以加快大文 件的读/写,但会浪费较多的空间,对平均文件大小较小的文件系统比较不利。
区块大小只可以 在格式化文件系统时设定,以后除重新格式化外不能改变。XFS 文件系统的区块大小最少可以 为 512 字节,最大不可超过 64KB,默认为 4KB。
然而区块大小又受到作业系统内核的 page 大 小限制。在 X86 计算机中,区块最大不可超过 4KB。其他平台如 IA64 可以使用较大区块, 不过过大区块会浪费空间,所以不建议使用大于 4KB 的区块。在选择区块大小时要注意以下 几点:

如果文件系统小于 100MB 或有大量小型文件,建议使用 512 字节区块,其余情况建议 使用 4KB 区块。
如果用作新闻组服务器(News Server)或有大量小型文件,可以使用 512 字节文件系统 区块和 4KB 目录区块(使用-nsize=大小选项)。
简单而言,XFS 文件系统在 X86 平台上可以使用 512B、1KB、2KB 和 4KB 区块。格式化 显要指定区块大小需要使用选项“-b size=区块大小”:

mkfs.xfs –b size=512 /dev/sdb6

3)目录区块大小(Directory Block Size)
XFS 容许目录使用比文件系统区块大小更小的区块,方法是使用选项“-n size=区块大小”, 例如:

mkfs.xfs –b size=512 –n size=4k /dev/sdb6

区块大小后加上“k”表示单位为 KB(1024 字节),加上“s”表示单位为磁区(sector, 默认为 512 字节,可能会因-s 选项而改变),加上“b”表示单位为文件系统区块(默认为 4KB, 可能会因-b 选项而改变)。

4)日志大小
格式化 XFS 时,mkfs.xfs 会自动根据文件系统的大小划分日志(Journal)的大小。若文件 系统等于或超过 1TB,则划分日志只会为最大值 128MB。最小不会小于 512 文件系统区块。 可以使用选项“-l size=日志大小”指定日志的大小,例如:

mkfs.xfs –l size=1024b /dev/sdb6

日志大小可以加以下单位。

s:磁区(sector)大小(默认为 512 字节,可能会因-s 选项而改变)。
b:文件系统区块大小(默认为 4KB,可能会因-b 选项而改变)
k:KB(1 024 字节)。
m:MB(1 048 576 字节)。
g:GB(1 073 741 824 字节)。
t:TB(1 099 511 627 776 字节)。
p:PB(1024TB)。
e:EB(1 048 576TB)。
如果有多于一个硬盘,可以考虑使用外部日志(External Journal)把文件系统和日志存储 在不同的硬盘,可以增加效能。

5)文件系统标签(Filesystem Label)

文件系统标签(Filesystem Label)又叫作 Volume Name,是文件系统中一个小栏目,用作 简述该文件系统的用途或其存储数据。可以使用选项“-L 标签”在格式化时设定文件系统标签。

mkfs.xfs -L Videos /dev/sdc1

XFS 的文件系统标签不能超过 12 个字符。以后可以使用命令 xfs_admin -L 改变。

6)一个例子 示例代码如下:

mkfs.xfs –d agcount=4 –l size=32m /dev/sdb5

第一个选项是-l size=32m,它告诉 mkfs.xfs 配置用户的文件系统使之拥有一个高达 32MB 的元数据日志。
这通过降低在文件系统处于繁忙使用期间元数据日志将“填满”的可能性而改 善了性能。
第二个选项通过告诉 mkfs.xfs 将创建的分配组的数目最小化,让用户增强新文件系 统的性能。
通常,mkfs.xfs 自动选择分配组的数目,但是,根据笔者的经验,它通常会选择一 个比大多数用于一般用途的 Linux 工作站和服务器过高一点的数目。
分配组让 XFS 并行执行多 个元数据操作,这为高端服务器带来了便利,但是太多的分配组确实会增加一些开销。
因此, 不要让 mkfs.xfs 为用户的文件系统选择分配组的数目,而是通过使用-d agcount=x 选项指定一 个数目。
将 x 设置成一个小数目,如 4、6 或 8。需要使得目标块设备中每 4GB 容量至少有一 个分配组。同时进行这两项调整,使用下面的命令创建“优化的”XFS 文件系统:

mount -t /dev/sda6 /mnt -o noatime,nodiratime,osyncisdsync

前面的两个选项(noatime,nodiratime)关闭 atime 更新。osyncisdsync 选项调整 XFS 的同 步/异步行为,以便它同 Ext3 更一致。

3.挂载 XFS 文件系统

mount –t xfs/dev/sdb5/xfs

其中,/xfs 是主分区/下的一个目录。
为了让系统启动后就自动加载,应该更改/etc/fstab,这样系统启动后就会自动加载 xfs 分 区而不必每次都手工加载。添加如下一行:
/dev/hdb5 /xfs defaults 1 1
挂装时,将使用一些性能增强 mount 选项来最大限度地发掘出(或发挥出)新文件系统的 性能。

mount –t /dev/sdb5 /xfs –o noatime,nodiratime,osyncisdsync

前面的两个 mount 选项关闭 atime 更新,几乎不需要 atime 更新,并且它除了降低文件系统性能之外几乎不起任何作用。osyncisdsync 选项调整 XFS 的同步/异步行为,以便它同 Ext3 更一致。多亏了 mkfs.xfs 和 mount 调整,新的 XFS 文件系统比没有调整时的性能要好得多。

其他 mount -o 选项如下。
allocsize=:延时分配时,预分配 buffered 大小。
sunit=/swidth=:使用指定的条带单元与宽度(单位为 512Byte)。
swalloc:根据条带宽度的边界调整数据分配。
discard:块设备自动回收空间。
dmapi:使能 Data Management API 事件。
inode64:创建 inode 节点位置不受限制。
inode32:inode 节点号不超过 32 位(为了兼容)。
largeio:大块分配。
nolargeio:尽量小块分配。
noalign:数据分配时不用条带大小对齐。
noatime:读取文件时不更新访问时间。
norecovery:挂载时不运行日志恢复(只读挂载)。
logbufs=:内存中的日志缓存区数量。
logbsize=:内存中每个日志缓存区的大小。
logdev=/rtdev=:指定日志设备或实时设备。XFS 文件系统可以分为 3 部分:数据、日志、实时(可选)。

4.调整 XFS 文件系统各项参数
1)XFS 卷标管理

(1)查看当前的卷标。

xfs_admin -l /dev/sdb

label=”document”
(2)设置新的卷标。

xfs_admin -L “VideoRecords” /dev/sdb

writing all SBs
new label=”VideoRecords”
2)UIID 管理
通用唯一标识符(UUID)是 128 比特的数字,用来唯一地标识因特网上的某些对象或者 实体。传统上,GNU/Linux 在/etc/fstab 上直接使用设备名称(/dev/hda1 或/dev/sda5 等)指定要 挂载的存储设备。然而设备名称有时会因为 BIOS 的设定而改变,引起混乱。所以现在部分Linux distribution 已改用 UUID(Universal Unique Identifier)来指定要挂载的存储设备。

(1)查看当前所有存储设备的 UUID 名称。

blkid –s UUID

/dev/sda1:UUID=”34dd521d-fb74-41cf-afc6-e786344ecd7a”
/dev/sda2:UUID=”UskH3q-GHDB-ZLoo-kPRb-O1sq-wKSU-CwH0Lt”
/dev/mapper/rhel-root:UUID=”e7e811fd-3c45-4bcd-84cb-92c4aafccf16″
/dev/sdb:UUID=”36cf1092-65e2-4acd-85fc-284b1e7b1f33″
/dev/mapper/rhel-swap:UUID=”800748d6-f4ae-4bc7-90d9-e69478fd4af3″
(2)查看指定存储设备的 UUID。

xfs_admin –u /dev/sdb

UUID=cd4f1cc4-15d8-45f7-afa4-2ae87d1db2ed
(3)生成一个新的 UUID。

xfs_admin –U generate /dev/sdb

writing all SBs
new UUID=c1b9d5a2-f162-11cf-9ece-0020afc76f16
-U 的参数如果为 generate,则表示直接产生一个新的 UUID;如果为 nil,则表示清除文件 系统的 UUID。

xfs_admin –U nil /dev/sda1

3)在 mount 命令中使用 UUID 挂载文件系统
使用 mount 命令挂载文件系统,可以使用选项“-U uuid”取代设备文件指定要挂载的设备。

mount –U 51f7e9a4-5154-4e29-a7a6-208417290b85 /mnt
也可以使用 UUID=uuid 取代-U 选项。

mount UUID=”51f7e9a4-5154-4e29-a7a6-208417290b85″ /mnt
在文件/etc/fstab 中可以使用 UUID=uuid 取代设备文件指定要挂载的设备。

UUID=”e61f4197-5f00-4f4f-917c-290922a85339″ /xfs defaults 0 1
UUID=”51f7e9a4-5154-4e29-a7a6-208417290b85″ /boot xfs defaults 0 2
5.在线调整 XFS 文件系统的大小
XFS 提供了 xfs_growfs 工具,可以在线调整 XFS 文件系统的大小。XFS 文件系统可以向 保存当前文件系统的设备上的未分配空间延伸。这个特性常与卷管理功能结合使用,因为后者 可以把多个设备合并进一个逻辑卷组,而使用硬盘分区保存 XFS 文件系统时,每个分区需要 分别扩容。

xfs_growfs –D 1073741824 /myxfs1

xfs_growfs –d /myxfs1

6.暂停和恢复 XFS 文件系统
(1)暂停 XFS 文件系统。

xfs_freeze –f /myxfs

(2)恢复 XFS 文件系统。

xfs_freeze –u /myxfs

7.尝试修复受损的 XFS 文件系统
XFS 与 Ext3 相比的特点是并行 I/O,如果一个文件系统使用的硬盘比较多,而且总线允许 并行的话,XFS 有明显的性能优势。而在台式计算机上,这个区别很不明显。
另外,Ext3 删除文件的速度比 XFS 要快;由于大量采用 Cache,XFS 不用 fsck,但必须保 证电源供应,突然断电时 XFS 的损失比 Ext3 要严重。

# xfs_repair –L /dev/hda13

8.备份和恢复
(1)备份文件系统。

xfsdump-F –f /root/dump.xfs /mnt

(2)恢复文件系统。

xfsrestore –f /root/dump.xfs /mnt

9.碎片管理
可以使用 xfs_db 命令调试或检测 XFS 文件系统(查看文件系统碎片等)。

(1)查看碎片情况。

1、查看/dev/sdc1的碎片情况:(SSD磁盘碎片整理会降低磁盘寿命)
# xfs_db -c frag -r /dev/sdc1
actual 93133, ideal 8251, fragmentation factor 91.14%
这个应该整理一下碎片了;

2、查看/dev/sdb1的碎片情况:
    # xfs_db -c frag -r /dev/sdb1
    actual 905607, ideal 900507, fragmentation factor 0.56%
 这个不用做碎片整理。    

3、另一种命令形式: 
    # xfs_db -r /dev/sdd1
    xfs_db> frag
    actual 117578, ideal 116929, fragmentation factor 0.55%

4、也可以通过xfs_bmap命令了解某个文件的情况: 
    # xfs_bmap -v case19.dat

(2)整理碎片。

xfs_fsr /dev/sda1

发表在 linux文章 | 留下评论

计算机软件世界分类思维导图

计算机软件世界分类详解

一、系统软件

系统软件是管理计算机硬件和软件资源的基础软件,为用户提供操作界面和编程接口。

1. 操作系统

操作系统是计算机系统的核心,负责管理硬件资源和提供应用程序运行环境。

主流操作系统

  • Windows:微软开发的桌面和服务器操作系统,市场占有率高,兼容性强。
  • macOS:苹果公司开发的桌面操作系统,以设计精美和易用性著称。
  • Linux:开源操作系统,有众多发行版(Ubuntu、Debian、CentOS 等),广泛用于服务器和嵌入式系统。
  • Android:基于 Linux 的移动操作系统,由 Google 主导开发,占据全球智能手机市场大部分份额。
  • iOS:苹果公司开发的移动操作系统,用于 iPhone、iPad 等设备。

技能栈

  • 深入理解操作系统原理(进程管理、内存管理、文件系统等)
  • 驱动开发:掌握 C/C++ 语言,了解硬件接口知识
  • 内核编程:能够修改和优化操作系统内核

2. 驱动程序

驱动程序是操作系统与硬件设备之间的接口,负责控制和管理硬件设备的工作。

常见驱动程序

  • 显卡驱动:优化图形性能,支持高分辨率和 3D 加速
  • 声卡驱动:提供高质量音频输出和录制功能
  • 外设驱动:如打印机、扫描仪、键盘鼠标等设备的驱动

技能栈

  • 精通 C/C++ 语言
  • 了解硬件设备的工作原理和接口规范
  • 掌握驱动开发工具和调试技术

3. 中间件

中间件是位于操作系统和应用程序之间的软件,提供通用服务和功能,简化应用程序开发。

常见中间件

  • Web 服务器:如 Apache、Nginx,处理 HTTP 请求,提供 Web 服务
  • 应用服务器:如 Tomcat,运行 Java Web 应用程序
  • 消息队列:如 RabbitMQ、Kafka,实现异步通信和分布式系统

技能栈

  • 掌握 Java、Python 等编程语言
  • 熟悉网络编程和分布式系统原理
  • 了解中间件的配置和性能优化

二、应用软件

应用软件是为满足特定用户需求而开发的软件,涵盖范围广泛。

1. 办公软件

办公软件是日常工作中最常用的软件,用于文档处理、数据管理和演示。

常见办公软件

  • 文字处理:如 Microsoft Word、WPS 文字,用于文档编辑和排版
  • 电子表格:如 Microsoft Excel、WPS 表格,用于数据处理和分析
  • 演示软件:如 Microsoft PowerPoint、WPS 演示,用于制作幻灯片和演示文稿

技能栈

  • 掌握办公软件的高级功能(如 Excel 函数、PPT 动画)
  • 了解 VBA 编程,可开发自动化办公工具
  • 掌握文档格式处理(如 PDF 转换、文档合并)

2. 图形图像软件

图形图像软件用于创建、编辑和处理图像、视频和 3D 模型。

常见图形图像软件

  • 图像处理:如 Adobe Photoshop,用于照片编辑、图像合成等
  • 3D 建模:如 Blender、Maya,用于创建 3D 模型和动画
  • 动画制作:如 Adobe After Effects,用于视频特效和动画制作

技能栈

  • 掌握 Python 或 JavaScript,可开发插件和自动化脚本
  • 了解计算机图形学原理和算法
  • 熟悉 OpenCV 等图像处理库

3. 媒体软件

媒体软件用于播放、编辑和处理音频、视频等多媒体内容。

常见媒体软件

  • 音频编辑:如 Audacity、Adobe Audition,用于音频录制和编辑
  • 视频编辑:如 Adobe Premiere Pro、Final Cut Pro,用于视频剪辑和后期制作
  • 播放器:如 VLC、PotPlayer,用于播放各种格式的音频和视频文件

技能栈

  • 掌握 FFmpeg 等多媒体处理工具
  • 了解音频和视频编码格式和原理
  • 熟悉音频和视频处理算法

4. 教育软件

教育软件用于辅助教学和学习,提供个性化学习体验。

常见教育软件

  • 学习平台:如 Moodle、Canvas,用于在线课程管理和教学
  • 语言学习:如 Duolingo、Rosetta Stone,用于语言学习和练习
  • 学科教育:如 Khan Academy,提供各学科的在线教学资源

技能栈

  • 掌握前端开发技术(HTML、CSS、JavaScript)
  • 了解教育心理学和教学设计原则
  • 熟悉学习管理系统(LMS)的开发和集成

5. 娱乐软件

娱乐软件用于提供娱乐功能,如游戏、虚拟现实等。

常见娱乐软件

  • 游戏:使用 Unity、Unreal Engine 等引擎开发的各类游戏
  • 虚拟现实 (VR):如 Oculus Rift、HTC Vive,提供沉浸式体验
  • 增强现实 (AR):如 Pokémon Go、Snapchat 滤镜,将虚拟内容与现实结合

技能栈

  • 掌握 C#、C++ 等编程语言
  • 熟悉游戏引擎的使用和开发
  • 了解 3D 建模和动画制作

6. 安全软件

安全软件用于保护计算机系统和数据免受未经授权的访问、攻击和破坏。

常见安全软件

  • 杀毒软件:如 Avast、Kaspersky,检测和清除病毒、木马等恶意软件
  • 防火墙:监控和控制网络流量,防止外部攻击
  • 加密工具:如 VeraCrypt,保护数据隐私和安全

技能栈

  • 掌握逆向工程技术,分析和破解恶意软件
  • 了解密码学原理和算法
  • 熟悉网络安全漏洞和防范措施

7. 企业软件

企业软件是为企业组织设计的软件,用于管理业务流程和提高工作效率。

常见企业软件

  • ERP 系统:如 SAP、Oracle ERP,集成企业资源规划、财务、人力资源等功能
  • CRM 系统:如 Salesforce、Microsoft Dynamics,管理客户关系和销售流程
  • HR 系统:如 Workday、ADP,管理人力资源、薪资和福利等

技能栈

  • 掌握 Java、Python 等编程语言
  • 熟悉数据库设计和开发
  • 了解企业架构和业务流程

8. 开发工具

开发工具是程序员用于开发、测试和调试软件的工具。

常见开发工具

  • 集成开发环境 (IDE):如 Visual Studio、IntelliJ IDEA、Eclipse,提供代码编辑、编译、调试等功能
  • 版本控制系统:如 Git、SVN,管理源代码的版本和变更
  • 构建工具:如 Maven、Gradle,自动化软件构建过程
  • 调试工具:如断点调试器、内存分析工具,帮助定位和修复软件缺陷

技能栈

  • 熟悉多种编程语言和开发框架
  • 掌握版本控制和团队协作技巧
  • 了解自动化测试和持续集成 / 部署 (CI/CD)

三、网络软件

网络软件是用于实现计算机网络通信和资源共享的软件。

1. 网络协议

网络协议是计算机网络通信的规则和标准,定义了数据传输的格式和方式。

常见网络协议

  • HTTP/HTTPS:用于 Web 浏览器和 Web 服务器之间的通信,HTTPS 是 HTTP 的安全版本
  • TCP/IP:互联网的基础协议,提供可靠的数据传输
  • UDP:无连接的传输协议,适用于实时应用(如视频流、游戏)

技能栈

  • 掌握网络编程技术(如 Socket 编程)
  • 熟悉网络协议的原理和实现
  • 了解网络安全和加密技术

2. 网络应用

网络应用是基于网络协议开发的应用程序,实现各种网络服务和功能。

常见网络应用

  • 浏览器:如 Chrome、Firefox,用于访问 Web 内容
  • 邮件客户端:如 Outlook、Thunderbird,用于收发电子邮件
  • 即时通讯:如微信、QQ、Slack,用于实时文字、语音和视频通信

技能栈

  • 掌握 Web 开发技术(HTML、CSS、JavaScript、后端语言)
  • 熟悉 Socket 编程和网络通信协议
  • 了解分布式系统和微服务架构

3. 云计算软件

云计算软件通过互联网提供计算资源和服务,使用户无需拥有本地硬件和软件。

云计算服务模式

  • IaaS (基础设施即服务):如 AWS、Azure,提供虚拟服务器、存储和网络等基础设施
  • PaaS (平台即服务):如 Heroku、Google App Engine,提供开发和部署应用的平台
  • SaaS (软件即服务):如 Office 365、Salesforce,通过浏览器直接使用软件服务

技能栈

  • 掌握容器化技术(如 Docker)和编排工具(如 Kubernetes)
  • 熟悉云服务提供商(如 AWS、Azure、Google Cloud)的服务和 API
  • 了解分布式系统和弹性计算原理

四、数据库软件

数据库软件是用于存储、管理和检索数据的软件系统。

1. 关系型数据库

关系型数据库采用关系模型组织数据,使用 SQL 语言进行操作。

常见关系型数据库

  • MySQL:开源数据库,广泛用于 Web 应用和中小企业
  • PostgreSQL:功能强大的开源数据库,支持高级数据类型和复杂查询
  • Oracle:商业数据库,提供高性能和高可用性,适用于大型企业

技能栈

  • 精通 SQL 语言,包括查询、插入、更新和删除操作
  • 熟悉数据库设计原则和规范化理论
  • 掌握数据库性能优化和索引设计技巧

2. 非关系型数据库

非关系型数据库(NoSQL)采用非关系模型,适合存储非结构化和半结构化数据。

常见非关系型数据库

  • 文档数据库:如 MongoDB,存储 JSON-like 文档
  • 键值存储:如 Redis,存储键值对,支持高性能缓存
  • 图数据库:如 Neo4j,存储节点和关系,适合社交网络等应用

技能栈

  • 了解不同类型的 NoSQL 数据库及其适用场景
  • 掌握数据建模和查询技术
  • 熟悉分布式数据库原理和实现

3. 数据库管理工具

数据库管理工具用于管理和操作数据库,提供图形化界面和命令行工具。

常见数据库管理工具

  • phpMyAdmin:基于 Web 的 MySQL 管理工具
  • Navicat:多数据库管理工具,支持 MySQL、PostgreSQL、Oracle 等
  • pgAdmin:PostgreSQL 专用管理工具

技能栈

  • 掌握数据库备份、恢复和迁移技术
  • 了解数据库安全和权限管理
  • 熟悉数据库性能监控和调优

五、人工智能与机器学习

人工智能与机器学习是当前最热门的技术领域,致力于让计算机模拟人类智能。

1. 机器学习框架

机器学习框架提供了开发和训练机器学习模型的工具和库。

常见机器学习框架

  • TensorFlow:Google 开发的开源深度学习框架,支持各种深度学习任务
  • PyTorch:Facebook 开发的开源深度学习框架,以动态计算图和易用性著称
  • Scikit-learn:Python 的机器学习库,提供各种经典机器学习算法和工具

技能栈

  • 精通 Python 编程语言
  • 掌握线性代数、概率论和统计学习理论
  • 熟悉机器学习算法(分类、回归、聚类、深度学习等)

2. 自然语言处理 (NLP)

自然语言处理致力于让计算机理解和处理人类语言。

常见 NLP 任务

  • 文本分类:将文本分类到预定义的类别中(如垃圾邮件检测)
  • 机器翻译:自动将一种语言翻译成另一种语言
  • 聊天机器人:构建能够与人类进行对话的智能系统

技能栈

  • 掌握 NLP 库(如 NLTK、spaCy、Transformers)
  • 了解深度学习模型(如 BERT、GPT)
  • 熟悉文本预处理和特征提取技术

3. 计算机视觉

计算机视觉致力于让计算机理解和解释图像和视频。

常见计算机视觉任务

  • 图像识别:识别图像中的物体和场景
  • 目标检测:定位和识别图像中的多个目标
  • 人脸识别:识别和验证人脸身份

技能栈

  • 掌握 OpenCV 等计算机视觉库
  • 熟悉卷积神经网络 (CNN) 和深度学习模型
  • 了解图像处理和特征提取技术

4. 机器人技术

机器人技术结合了人工智能、计算机视觉和控制理论,开发能够自主执行任务的机器人。

常见机器人应用

  • 工业机器人:在工厂中执行装配、焊接等任务
  • 服务机器人:如扫地机器人、送餐机器人
  • 无人机:用于航拍、物流配送等

技能栈

  • 掌握机器人操作系统 (ROS)
  • 熟悉 C++、Python 等编程语言
  • 了解控制理论和路径规划算法

六、移动应用开发

移动应用开发是为移动设备(如智能手机、平板电脑)开发应用程序的过程。

1. 原生应用开发

原生应用开发使用特定平台的编程语言和工具,开发针对特定操作系统的应用。

主流平台

  • Android:使用 Kotlin 或 Java 开发,运行在 Android 设备上
  • iOS:使用 Swift 或 Objective-C 开发,运行在 iOS 设备上

技能栈

  • 掌握相应平台的编程语言和开发工具
  • 了解移动 UI 设计原则和最佳实践
  • 熟悉平台 SDK 和 API

2. 跨平台开发

跨平台开发使用单一代码库,开发能够在多个平台上运行的应用。

常见跨平台框架

  • Flutter:Google 开发的框架,使用 Dart 语言,提供高性能原生界面
  • React Native:Facebook 开发的框架,使用 JavaScript 和 React,支持原生组件
  • Xamarin:Microsoft 开发的框架,使用 C# 和.NET,支持原生界面

技能栈

  • 掌握 JavaScript、Dart 或 C# 等编程语言
  • 熟悉响应式设计和跨平台开发模式
  • 了解平台特定的优化和调试技术

3. 后端服务

移动应用通常需要后端服务支持,如数据存储、用户认证和推送通知。

常见后端技术

  • RESTful API:提供标准化的接口,供移动应用调用
  • 推送通知服务:如 Firebase Cloud Messaging (FCM),发送通知到移动设备
  • 云存储:如 AWS S3、Google Cloud Storage,存储应用数据和文件

技能栈

  • 掌握 Node.js、Python、Java 等后端语言
  • 熟悉 RESTful API 设计和实现
  • 了解云服务提供商的移动后端服务

七、游戏开发

游戏开发是一个综合性领域,涉及编程、美术、设计等多个方面。

1. 游戏引擎

游戏引擎是开发游戏的工具集,提供渲染、物理模拟、音频等功能。

常见游戏引擎

  • Unity:跨平台游戏引擎,使用 C# 语言,适合开发 2D 和 3D 游戏
  • Unreal Engine:高性能游戏引擎,使用 C++ 语言,适合开发 AAA 级游戏
  • Godot:开源游戏引擎,使用 GDScript 或 C#,适合独立开发者和小型团队

技能栈

  • 掌握 C#、C++ 等编程语言
  • 熟悉游戏引擎的架构和工作流程
  • 了解图形渲染和物理模拟原理

2. 游戏类型

游戏类型多种多样,每种类型有不同的设计和开发需求。

常见游戏类型

  • 角色扮演游戏 (RPG):如《塞尔达传说》、《巫师 3》
  • 第一人称射击 (FPS):如《CS:GO》、《使命召唤》
  • 策略游戏:如《文明》、《星际争霸》
  • 休闲游戏:如《愤怒的小鸟》、《王者荣耀》

技能栈

  • 了解游戏设计模式和机制
  • 掌握游戏 AI 编程(如行为树、路径规划)
  • 熟悉用户体验 (UX) 设计原则

3. 游戏服务器

多人游戏需要服务器支持,实现玩家之间的实时通信和同步。

常见游戏服务器技术

  • 客户端 – 服务器架构:大部分网络游戏采用的架构
  • 点对点 (P2P) 架构:适合小型多人游戏
  • 实时同步技术:如锁步算法、预测补偿

技能栈

  • 掌握网络编程和低延迟通信技术
  • 了解分布式系统和负载均衡
  • 熟悉数据库设计和优化,满足游戏数据存储需求

八、嵌入式系统

嵌入式系统是嵌入到其他设备中的专用计算机系统,通常具有特定功能和资源限制。

1. 微控制器编程

微控制器是嵌入式系统的核心,集成了处理器、内存和外设接口。

常见微控制器平台

  • Arduino:开源电子原型平台,易于学习和使用
  • Raspberry Pi:单板计算机,功能强大,适合复杂应用
  • STM32:高性能微控制器,广泛用于工业控制和物联网

技能栈

  • 掌握 C/C++ 语言,了解嵌入式系统编程
  • 熟悉硬件接口(如 GPIO、SPI、I2C)
  • 了解低功耗设计和电源管理

2. 实时操作系统 (RTOS)

实时操作系统用于对时间敏感的应用,确保任务在严格的时间限制内完成。

常见 RTOS

  • FreeRTOS:开源 RTOS,广泛用于嵌入式系统
  • VxWorks:商业 RTOS,用于航空航天、国防等关键领域
  • uC/OS:可裁剪的 RTOS,适合资源受限的系统

技能栈

  • 了解实时系统设计原则和调度算法
  • 掌握 RTOS 的配置和应用开发
  • 熟悉中断处理和定时器管理

3. 物联网 (IoT)

物联网是通过互联网连接各种物理设备,实现数据交换和远程控制的网络。

物联网关键技术

  • 传感器集成:如温度、湿度、加速度传感器
  • 数据采集和传输:如 MQTT、CoAP 等协议
  • 边缘计算:在设备端进行数据处理和分析

技能栈

  • 掌握 Python、C/C++ 等编程语言
  • 熟悉物联网协议和通信技术
  • 了解云平台和数据分析工具

九、区块链

区块链是一种分布式账本技术,具有去中心化、不可篡改等特点。

1. 区块链平台

区块链平台提供了开发和部署区块链应用的基础设施。

常见区块链平台

  • Bitcoin:第一个加密货币和区块链平台
  • Ethereum:支持智能合约的区块链平台,使用 Solidity 语言
  • Hyperledger:开源区块链框架,适合企业级应用

技能栈

  • 掌握 Solidity 等智能合约编程语言
  • 了解密码学原理和哈希算法
  • 熟悉区块链网络的架构和共识机制

2. 智能合约

智能合约是自动执行的合约,代码直接控制资产和交易。

常见智能合约应用

  • 去中心化应用 (DApp):运行在区块链上的应用
  • DeFi (去中心化金融):如借贷、交易等金融服务
  • NFT (非同质化代币):如数字艺术品、收藏品等

技能栈

  • 掌握 Web3.js 等区块链开发工具
  • 了解智能合约安全和漏洞防范
  • 熟悉以太坊虚拟机 (EVM) 和 Gas 机制

3. 共识机制

共识机制是区块链网络达成一致的算法,确保数据一致性和安全性。

常见共识机制

  • PoW (工作量证明):如 Bitcoin 使用的机制,通过计算能力达成共识
  • PoS (权益证明):根据持币量和时间来决定记账权
  • DPoS (委托权益证明):如 EOS 使用的机制,通过投票选出记账节点

技能栈

  • 了解分布式系统理论和共识算法
  • 掌握区块链网络的配置和维护
  • 熟悉共识机制的优缺点和适用场景

以上就是计算机软件世界的主要分类及其所需技能栈。这个分类并非绝对,实际应用中可能会有交叉和重叠。希望这个思维导图和文档能帮助你更好地了解软件世界的全貌和各方向的发展路径。

发表在 linux文章 | 留下评论

UEC规范

有关 UltraEthernetConsortium 的更多信息,请访问:https://ultraethernet.org

UEC规范v1.0 – 1.简介_整体架构_软硬件分层-腾讯云开发者社区-腾讯云

《UEC 规范 v1.0 – 1. 简介_整体架构_软硬件分层》的技术文档,主要介绍了超级以太网联盟(UEC)及其规范,涉及 UEC 的背景、组织架构、传输配置文件、规范约定、系统视图、术语、软件和网络架构、各层功能等内容,旨在提升以太网在 AI 和 HPC 中的性能与互操作性,推动相关领域网络技术发展。以下是详细总结:

一、UEC 概述

  • 组织定位:UEC 是隶属于 Linux 基金会的标准组织,致力于定义和推广适用于现代计算环境的高性能以太网技术,成员包括超大规模计算厂商、系统供应商、芯片供应商等。
  • 核心使命:增强以太网在人工智能(AI)和高性能计算(HPC)中的应用,提高相关应用的性能、功能和互操作性。
  • 规范范围:涵盖从物理层到软件层的多层架构,包括传输协议、API 接口、网络管理等,支持 AI 训练、推理、HPC 及客户端 / 服务器等工作负载。

二、UEC 架构与关键概念

(一)整体架构

  • 分层结构:参考 ISO/OSI 模型,涵盖物理层、链路层、网络层、传输层及软件层,各层由不同工作组负责(如管理工作组、合规性工作组等)。
  • 传输配置文件:定义三种配置文件以适配不同工作负载:
  • AI Base:满足基础 AI 应用的高性能、低成本需求。
  • AI Full:在 AI Base 基础上增加可延迟发送、精确匹配等功能。
  • HPC:作为 AI Full 的超集,满足高性能计算需求。

(二)系统视图与术语

  • 核心组件
  • 前端端点(FEP):逻辑可寻址实体,分配 IP 地址,支持 UE 传输协议,连接计算节点与网络结构。
  • 交换矩阵(Fabric):由交换机和链路组成,分为控制平面、数据平面和管理平面,实现数据包转发与管理。
  • 节点与集群:节点是包含 FEP 的计算设备,集群由节点通过交换矩阵连接而成,支持并行作业和客户端 / 服务器两种计算模型。
  • 寻址模式
  • 相对寻址:用于并行作业,通过 JobID、PIDonFEP 等标识进程,支持大规模扩展。
  • 绝对寻址:用于客户端 / 服务器模型,通过 IP 地址、PIDonFEP 和资源索引(RI)定位服务。

(三)工作负载类型

  • AI 训练(AIT):以三维并行(数据并行、流水线并行、算子并行)为特征,需高带宽、中等延迟,消息大小通常为兆字节级。
  • AI 推理(AII):类似 AI 训练但无数据并行,批次小,延迟敏感,消息大小多为千字节级。
  • HPC:分为低深度(LD,高并行、低延迟敏感)和高深度(HD,长依赖链、高延迟敏感),消息大小差异大。
  • 客户端 / 服务器:如存储流量,请求拆分为小消息,可能出现随机拥塞。

三、软件与网络架构

(一)软件层

  • API 接口:支持 libfabric v2.0 API,与 AI 框架(如 TensorFlow、PyTorch)和 HPC 库无缝集成,无需应用程序修改。
  • 终端软件栈:FEP 上的软件栈包括语义子层、数据包传送子层(PDS)、拥塞管理子层(CMS)等,实现消息处理与传输。
  • 交换机软件栈:基于现有以太网交换机(如 SONiC、FBOSS),通过扩展支持 UE 功能(如数据包修剪),利用交换机抽象接口(SAI)与硬件交互。

(二)网络层

  • 网络分类
  • 前端网络:连接数据中心与外部,承载南北向(NS)和东西向(EW)流量,需高可用性和复杂功能(如安全策略)。
  • 后端横向扩展网络:专用高性能网络,支持 HPC 和 AI 训练,与前端网络分离,优化集体操作和低延迟。
  • 纵向扩展网络:短距离互连(如 GPU 间 NVLINK),支持内存语义和亚微秒级延迟。
  • 传输目标(UET):聚焦 RDMA 服务,优化 AI/HPC 工作负载,支持多路径、拥塞控制和端到端可靠性,兼容尽力而为和无损网络。
  • 拥塞管理:基于流量类别(TC)和显式拥塞通知(ECN),结合数据包修剪(可选)机制,减少丢包和延迟。

四、协议层规范

(一)传输层

  • 子层功能
  • 语义层(SES):通过 libfabric 集成应用框架,定义消息寻址与操作协议,支持零拷贝技术。
  • PDS 子层:提供可靠 / 不可靠、有序 / 无序数据包传送模式,适配不同应用需求。
  • CMS 子层:通过流量类别和多路径负载均衡实现拥塞控制,避免热点,提升网络利用率。
  • TSS 子层(可选):提供加密和密钥管理,保障 AI/HPC 作业数据安全。

(二)网络层(可选)

  • ECN 与数据包修剪:扩展 ECN 标记机制,允许交换机修剪竞争数据包并传递拥塞信号,FEP 强制支持接收修剪数据包。

(三)链路层(可选)

  • 链路层重试(LLR):减少端到端重传压力,提升延迟敏感型工作负载性能。
  • 基于信用的流量控制(CBFC):优化链路资源分配,可选支持部分工作负载。
  • 功能协商:通过 LLDP 等机制发现网络实体功能,确保互操作性。

(四)物理层

  • 标准遵循:基于 IEEE 802.3 100G 每通道信令,支持前向纠错(FEC),通过 FEC 统计预测链路质量,识别异常链路。

五、合规与互操作性

  • 合规要求:实现需满足规范中的强制性要求,可选功能若实现则需遵循定义。
  • 互操作性:通过配置文件、流量类别映射和功能协商机制,确保不同供应商设备的互操作性。

六、总结

UEC 规范通过分层架构和多维度优化,旨在解决 AI 和 HPC 领域对高性能网络的需求,在兼容现有以太网生态的基础上,提升带宽、降低延迟,并增强可扩展性和安全性,为大规模集群计算提供高效的网络解决方案。

发表在 linux文章 | 留下评论

写SSD磁盘性能不佳怎么排查

使用fio测试SSD直接I/O(Direct IO)性能仅有100MB/s的问题,结合SSD特性和fio测试原理,以下是可能的原因及优化方案:


🔧 一、关键原因分析

  1. ​接口或协议瓶颈​
    • ​SATA接口限制​​:若SSD通过SATA III(6Gb/s)连接,理论带宽上限为600MB/s,但实际性能可能受限于接口版本(如误接SATA II接口,上限仅300MB/s)或线材质量。
    • ​PCIe通道配置问题​​:NVMe SSD若安装在PCIe 2.0 x4插槽(理论带宽2GB/s),实际速度可能降至1GB/s以下;若插槽为x1模式,带宽会进一步降至250MB/s左右。
  2. ​fio参数配置不当​
    • ​队列深度不足​​:iodepth=1 时SSD无法发挥并行性,企业级NVMe SSD需设置 iodepth=32~128 以激活并发能力(参考)。
    • ​块大小过小​​:bs=4k 测试随机IOPS时带宽较低,测试吞吐量应使用 bs=1m(大块顺序读写)。
    • ​引擎未启用异步​​:未使用 ioengine=libaio 时,同步写会阻塞进程,导致吞吐量下降(需安装 libaio-devel 包)。
  3. ​文件系统与对齐问题​
    • ​4K未对齐​​:分区或文件未按4K对齐时,SSD会触发”读-改-写”操作,写入放大导致性能腰斩(可通过 fdisk -l 检查起始扇区是否整除8)。
    • ​未启用TRIM​​:长期使用后垃圾回收(GC)占用带宽,需挂载时添加 discard 选项或定期执行 fstrim
  4. ​硬件或固件问题​
    • ​过热降频​​:SSD温度 >70℃ 时主控会主动降频(性能下降30%~50%),需检查散热条件。
    • ​寿命耗尽​​:NAND磨损超过80%时纠错延迟剧增,通过SMART工具检查 05(重分配扇区数)和 B1(磨损计数)参数。

⚡ 二、优化方案与验证步骤

✅ 步骤1:调整fio参数(关键!)

# 大块顺序写测试吞吐量(目标:触发SSD峰值带宽)
fio --filename=/dev/nvme0n1 --direct=1 --rw=write --bs=1m --ioengine=libaio \
    --iodepth=64 --numjobs=4 --runtime=60 --group_reporting --name=write_test

# 随机读测试IOPS(排除带宽瓶颈)
fio --filename=/dev/nvme0n1 --direct=1 --rw=randread --bs=4k --ioengine=libaio \
    --iodepth=128 --runtime=60 --group_reporting --name=randread_test
  • ​参数说明​​:
    • numjobs=4:多线程并发模拟高负载
    • bs=1m:1MB大块提升吞吐量
    • ioengine=libaio:必须启用异步引擎

✅ 步骤2:检查硬件配置

  • ​接口确认​​: lspci -vv | grep -i nvme # 查看PCIe链路速度(Speed)与宽度(Width) 正常应显示 ​​Speed 8GT/s(PCIe 3.0)或 16GT/s(PCIe 4.0), Width x4​​。
  • ​散热监控​​: nvme smart-log /dev/nvme0 | grep temperature 温度应 ​​<70℃​​,否则需加装散热片。

✅ 步骤3:系统级优化

  • ​启用TRIM​​: # 临时触发 fstrim /mnt/ssd # 永久启用(/etc/fstab) UUID=... /mnt/ssd ext4 defaults,discard 0 0
  • ​内存锁避免Swap​​: echo 1 > /proc/sys/vm/swappiness # 降低Swap倾向

📊 三、性能异常排查表

​现象​​可能原因​​验证命令​
顺序写带宽仅100MB/sSATA II接口/PCIe x1模式lspci -vv | grep LnkSta
随机读IOPS < 10kiodepth=1 或未用libaio检查fio参数中的iodepth和ioengine
测试中带宽持续下降过热降频或GC占用带宽nvme smart-log /dev/nvme0
延迟波动 >200μs4K未对齐或NAND寿命耗尽fdisk -l + nvme smart-log

💎 总结建议

  1. ​优先验证接口与队列深度​​:80%的低性能问题源于 iodepth 不足或接口配置错误。
  2. ​区分测试目标​​:
    • ​带宽测试​​ → bs=1m, rw=write
    • ​IOPS测试​​ → bs=4k, rw=randread, iodepth=128
  3. ​企业级SSD特殊优化​​:若使用NVMe SSD,更新固件并启用NS(Namespace)隔离可减少干扰。

⚠️ ​​注意​​:若优化后仍无改善,需用 blktrace 分析I/O栈延迟(例:blktrace -d /dev/nvme0n1 -o - \| blkparse -i -),定位内核或硬件层瓶颈。

写SSD磁盘性能不佳怎么排查 – LinuxGuideLinuxGuide

Linux磁盘管理命令-xfs 管理命令 – LinuxGuideLinuxGuide

SSD性能优化策略 – LinuxGuideLinuxGuide

SSD性能优化策略 – LinuxGuideLinuxGuide

发表在 linux文章 | 留下评论

SSD性能优化策略

在Linux系统中优化SSD性能需综合考虑文件系统、内核参数、I/O调度算法及硬件配置,以下是关键优化策略及操作指南:


⚙️ 一、文件系统优化

  1. ​选择高性能文件系统​
    • ​XFS​​:针对大文件和高并发场景设计,支持延迟分配(减少碎片)和高效元数据管理,挂载参数建议:rw,noatime,inode64,allocsize=16m
    • ​EXT4​​:通用性强,需启用discard选项支持TRIM,挂载参数:discard,noatime,errors=remount-ro
    • ​Btrfs​​:支持高级功能(快照、数据校验),但需评估稳定性需求。
  2. ​禁用访问时间记录​
    /etc/fstab中添加noatimenodiratime,避免每次文件访问都更新时间戳,减少写入量。

⚡ 二、内核参数调整

  1. ​降低Swap使用频率​
    修改/etc/sysctl.confvm.swappiness=10 # 默认60,降低以减少SSD写入 避免频繁使用Swap分区,延长SSD寿命。
  2. ​启用TRIM功能​
    • ​自动TRIM​​:在/etc/fstab挂载选项中添加discard(适用于非RAID场景)。
    • ​手动TRIM​​:定期执行fstrim -av(推荐每周一次),或通过cron定时任务: # 创建/etc/cron.daily/trim #!/bin/sh fstrim -v / >> /var/log/trim.log fstrim -v /home >> /var/log/trim.log
    • ​RAID场景​​:TRIM默认失效,需通过echo value > /proc/sys/dev/raid/speed_limit_min调整RAID速度限制,并用blockdev --setra 65535 /dev/sdx设置预读。

🔧 三、I/O调度器设置

  • ​调度器选择​​:
    • noop:适用于SSD(无物理寻道),减少I/O调度开销。
    • deadline:均衡读写延迟,性能提升约5%。
  • ​修改方法​​: echo noop > /sys/block/sdx/queue/scheduler # sdx替换为实际设备名

🖥️ 四、硬件与系统配置

  1. ​启用CPU性能模式​
    避免节能模式(如powersave)限制I/O性能: echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 超频可进一步提升磁盘响应速度。
  2. ​分区对齐优化​
    使用fdisk -H 32 -C 32 -c创建分区,确保4K对齐,避免跨区块读写。 注:新系统(如Fedora Core 14+)默认支持对齐。

⚠️ 五、避免的误区

  1. ​禁用日志功能​​(如EXT4的data=writeback)可能提升性能,但增加崩溃风险,需谨慎。
  2. ​组RAID时​​:TRIM失效需手动优化RAID参数,且避免使用旧调度算法(如CFQ)。
  3. ​内核版本​​:低于2.6.33不支持TRIM,建议升级至3.0+。

🛠️ 六、场景化建议

  • ​数据库服务器​​:优先选XFS,搭配noop调度器,关闭Swap并启用TRIM。
  • ​桌面环境​​:EXT4+discard,定期fstrim,降低swappiness
  • ​大数据处理​​:启用CPU性能模式,增加I/O队列深度(如echo 1024 > /sys/block/sdx/queue/nr_requests)。

💎 总结

​优化项​​推荐配置​​生效方式​
文件系统XFS(挂载参数含noatime/etc/fstab
I/O调度器noop/sys/block/sdx/queue/scheduler
TRIMcron定期fstrim(RAID需特殊设置)cron任务或fstrim.timer
内核参数vm.swappiness=10/etc/sysctl.conf

优化前建议用hdparm -tT /dev/sdx测试基准速度。
注:部分操作需root权限,修改关键参数前请备份数据。

写SSD磁盘性能不佳怎么排查 – LinuxGuideLinuxGuide

Linux磁盘管理命令-xfs 管理命令 – LinuxGuideLinuxGuide

SSD性能优化策略 – LinuxGuideLinuxGuide

SSD性能优化策略 – LinuxGuideLinuxGuide

发表在 linux文章 | 留下评论

shell数组基础

Shell数组是存储多个值的数据结构,支持索引数组(数字下标)和关联数组(字符串键),常用于批量处理数据。以下是核心知识点及操作示例:


🔢 ​​1. 数组定义与分类​

  • ​索引数组​​:下标从0开始,元素用空格分隔。 array=("apple" "banana" "cherry") # 直接定义 array[0]="apple" # 逐个赋值
  • ​关联数组​​(Bash 4.0+):需先声明,键值对形式。 declare -A assoc_arr # 声明 assoc_arr=([id]=100 [name]="Tom") # 初始化

⚙️ ​​2. 数组操作​

​访问元素​

  • 索引数组:${array[0]}
  • 关联数组:${assoc_arr["name"]}
  • 获取所有元素:${array[@]}${array[*]}@推荐避免空格问题)。

​获取长度​

echo ${#array[@]}    # 输出元素个数
echo ${#array[0]}    # 输出第一个元素的字符长度

​遍历数组​

  • ​索引数组​​: for i in "${array[@]}"; do echo "$i"; done # 遍历值 for i in "${!array[@]}"; do echo "$i: ${array[$i]}"; done # 遍历下标和值
  • ​关联数组​​: for key in "${!assoc_arr[@]}"; do echo "$key: ${assoc_arr[$key]}"; done

​增删改查​

  • ​增加元素​​: array+=("orange") # 尾部追加 assoc_arr["age"]=25 # 关联数组新增键
  • ​删除元素​​: unset array[1] # 删除索引数组第二个元素 unset assoc_arr["name"] # 删除关联数组键 unset array # 删除整个数组
  • ​修改元素​​: array[0]="grape" # 索引数组修改 assoc_arr["id"]=200 # 关联数组修改

​切片与替换​

  • ​切片​​:${array[@]:1:2} # 从下标1开始截取2个元素
  • ​临时替换​​:${array[@]/apple/pear} # 替换所有匹配值(不修改原数组)
  • ​永久替换​​:array=(${array[@]/apple/pear})

🔑 ​​3. 关联数组特有操作​

  • 声明必须使用 declare -A
  • 键可以是任意字符串,如: declare -A colors colors["red"]="#FF0000"

💡 ​​4. 实用技巧​

  • ​数组转函数参数​​: func() { local arr=("$@"); echo "${arr[@]}"; } func "${array[@]}" # 传递数组
  • ​命令结果转数组​​: files=($(ls)) # 将ls输出存入数组
  • ​判断下标是否存在​​: if [[ -v array[3] ]]; then echo "下标3存在"; fi

💎 ​​总结​

​操作​​索引数组​​关联数组​
​声明​直接定义declare -A 必需
​访问元素​${array[0]}${assoc_arr["key"]}
​遍历​for i in "${array[@]}"for key in "${!assoc_arr[@]}"
​删除元素​unset array[1]unset assoc_arr["key"]

关联数组需Bash 4.0+(查看版本:bash --version)。若需复杂数据处理,可结合循环和条件判断实现排序、过滤等。

通过灵活运用数组,可高效管理批量数据(如日志分析、配置项存储)。建议实操练习以巩固语法细节。

发表在 linux命令, linux文章 | 留下评论

shell函数基础

Shell 函数是脚本中封装可重用代码块的核心工具,可提升代码模块化、可读性和维护性。以下是关键知识点及操作示例(基于 Bash):


⚙️ ​​一、定义与调用​

​定义方式​

  1. ​标准语法​​(推荐) function_name() { command1 command2 } # 示例:打印欢迎信息 greet() { echo "Hello, $1!" }
  2. ​使用 function 关键字​function greet { echo "Hello, $1!" }

​调用函数​

greet "Alice"  # 输出:Hello, Alice!

📥 ​​二、参数传递​

​访问参数​

  • 位置参数:$1(第一个参数)、$2(第二个)等
  • 特殊变量:
    • $#:参数个数
    • $@:所有参数的独立列表
    • $*:所有参数合并为单个字符串
sum() {
  echo "参数个数: $#"
  echo "参数列表: ${@}"
  result=$(( $1 + $2 ))
  echo "结果: $result"
}
sum 10 20  # 输出:参数个数:2  参数列表:10 20  结果:30

​默认参数​

# 若未传参则使用默认值
print_msg() {
  local msg=${1:-"默认消息"}
  echo "$msg"
}
print_msg        # 输出:默认消息
print_msg "Hi"   # 输出:Hi

🔄 ​​三、返回值处理​

​两种返回值方式​

​方式​​说明​​示例​
return返回整数状态码(0-255),通过 $? 获取
echo输出任意数据,通过 $(函数) 捕获结果

​示例对比​​:

# 方式1:return(适合状态码)
is_even() {
  if (( $1 % 2 == 0 )); then
    return 0  # 成功
  else
    return 1  # 失败
  fi
}
is_even 4; echo $?  # 输出:0

# 方式2:echo(适合返回数据)
calc_square() {
  echo $(( $1 ** 2 ))
}
result=$(calc_square 5)  # 捕获输出
echo "平方值: $result"   # 输出:25

🔍 ​​四、变量作用域​

  • ​全局变量​​:默认所有变量全局有效 count=0 increment() { ((count++)); } increment; echo $count # 输出:1
  • ​局部变量​​:用 local 限制作用域 demo() { local var="内部变量" echo "函数内: $var" } demo; echo "函数外: $var" # 输出:函数内: 内部变量 函数外: (空)

🔁 ​​五、进阶技巧​

​1. 递归函数​

# 计算阶乘
factorial() {
  if (( $1 <= 1 )); then
    echo 1
  else
    local prev=$(factorial $(( $1 - 1 )))
    echo $(( $1 * prev ))
  fi
}
echo "5! = $(factorial 5)"  # 输出:120

​2. 函数库​

创建库文件 math_lib.sh

add() { echo $(( $1 + $2 )); }
multiply() { echo $(( $1 * $2 )); }

主脚本调用:

source math_lib.sh
result=$(add 3 4)  # 输出:7

​3. 处理数组参数​

# 将数组元素展开为多个参数
print_array() {
  for item in "$@"; do
    echo "元素: $item"
  done
}
arr=("A" "B" "C")
print_array "${arr[@]}"  # 正确传递数组

⚠️ ​​六、注意事项​

  1. ​参数限制​​:
    • 超过9个参数需用 ${10} 格式
    • 含空格的参数需加引号:func "arg with space"
  2. ​返回值陷阱​​:
    • return 仅支持 0-255 整数,超出值会取模(如 256→0)
    • $? 仅保存​​最近一条命令​​的退出状态
  3. ​关联数组函数​​:需 Bash 4.0+ 并声明 declare -A

💎 ​​总结​

​功能​​语法​​关键点​
​定义函数​func() { ... }省略 function 时括号不可省
​参数传递​$1, $@, ${10}含空格参数需引号包裹
​返回值​return 状态码echo 数据return 适合状态,echo 适合数据
​局部变量​local var=value避免污染全局作用域

关联数组需 Bash 4.0+(查看版本:bash --version)。实际脚本中建议多用函数封装逻辑,减少重复代码 。

发表在 linux命令, linux文章 | 留下评论

清空文件后再执行 rm 是否更快?

清空文件后再执行 rm 是否更快?

​简短回答:不一定更快,大多数情况下反而效率更低,且操作冗余。​​ 让我们深入分析原因:

truncate --size 0 命令原理

truncate --size 0 是一个用于修改文件大小的命令,其工作原理如下:

基本功能

这个命令会将指定文件的大小设置为0字节,即清空文件内容但保留文件本身。

底层原理

  1. ​文件系统操作​​:
    • 命令通过系统调用(通常是ftruncate()truncate())直接操作文件系统
    • 这些系统调用会修改文件的元数据(inode中的大小信息),而不是实际覆盖文件内容
  2. ​不涉及数据覆盖​​:
    • 与使用重定向(如> file)不同,truncate不会写入新数据
    • 它只是标记文件大小为0,文件系统会将这些存储块标记为可重用
  3. ​快速操作​​:
    • 因为不涉及实际数据写入,所以操作非常快速
    • 即使对大文件也是如此,因为只修改元数据
  4. ​保留文件属性​​:
    • 文件的权限、所有权和时间戳等属性保持不变
    • 只有内容被清空

与类似命令的区别

  • > file:创建新文件(如果不存在),需要写入操作
  • rm + touch:会改变文件的inode和创建时间
  • dd if=/dev/null of=file:实际写入空数据

truncate --size 0是清空文件最高效的方法之一,特别适合处理大文件。

✂️ 操作对比

场景一:直接 rm

rm filename
  • ​操作​​:直接删除文件的目录项,标记 inode 和磁盘块为可重用
  • ​特点​​:一次性完成删除,不涉及中间步骤

场景二:先清空后删除

truncate --size 0 filename  # 清空文件
rm filename                 # 删除文件
  • ​操作​​:两步操作(修改 inode + 删除操作),产生额外开销

⏱️ 性能分析表

操作小型文件 (1MB)大型文件 (10GB)巨型文件 (100GB+)
直接 rm⚡️ 极快⚡️ 快⚡️ 快
truncate + rm🐢 慢(开销大)🐢 慢(双重开销)⚠️ 稍快但无意义

🔍 为什么通常​​不会更快​

  1. ​双重系统调用开销​​:
    • truncate 触发 ftruncate() 系统调用 + 文件系统元数据更新
    • rm 触发 unlink() 系统调用 + 另一个元数据更新
    • 两次操作 > 一次操作的系统调用开销
  2. ​磁盘 I/O 无优势​​:
    • 现代文件系统删除操作只标记 inode/块为可用
    • 清空不会改变删除时的元数据操作量
  3. ​小文件劣势明显​​:
    • 清空操作成为额外负担
    • 直接删除的原子性更高

⚠️ 特殊情况下可能微快(但不推荐)

仅当同时满足:

  1. 文件​​极大​​(百GB级)
  2. 文件系统​​碎片严重​
  3. 磁盘I/O极慢时

可能原因:

  • truncate 先释放块 → rm 只需处理更小的元数据
  • 但仍被 ​​额外元数据操作​​ 抵消大部分优势

💡 建议方案

需求推荐命令优势
快速删除文件rm filename✅ 原子操作,效率最高
清空文件但保留truncate --size 0 filename✅ 保留权限和时间戳
安全清空后删除shred -u filename🔒 多次覆盖后删除 (高安全性)

📌 结论

  1. ​99% 场景下应直接使用 rm​:
    • 更高效、更简洁、更符合系统设计
    • 避免不必要的元数据操作
  2. ​清空再删除通常适得其反​​:
    • 多消耗一个系统调用
    • 需要两次磁盘寻址
    • 对小型文件尤其不利
  3. ​设计良好的文件系统优化了 rm​:
    • ext4/XFS/Btrfs 等现代文件系统已将大文件删除优化为轻量级操作

📎 ​​性能测试证明​​:在 SSD 上测试 10GB 文件删除

# 直接 rm:
real    0m0.001s

# truncate + rm:
truncate: real   0m0.002s
rm:      real   0m0.003s 
total   0m0.005s (慢500%)

简洁才是高效的真谛 — 需要删除文件时,直接 rm 是最好的选择!

发表在 linux命令, linux文章 | 留下评论

在​​16MB 和 64MB 内存块写入文件​​的场景下,fwrite 和 write 的性能对比

在​​16MB 和 64MB 内存块写入文件​​的场景下,fwritewrite 的性能对比如下:


​核心结论​

  1. ​对 16MB/64MB 单次大块写入,write() 有明确性能优势(吞吐量更高,延迟更低)​
  2. fwrite() 适用于​​小块或分散写入​​,但对大块数据有额外开销
  3. ​实际性能差异约 5%-20%,关键取决于标准库缓冲区的处理方式​

​性能对比表​

​指标​write() (系统调用)fwrite() (标准库)
​系统调用次数​​1次​​(单次写入 64MB)1次或多次(取决于缓冲区策略)
​数据拷贝次数​1次(用户态→内核态)2次(用户态→libc缓冲区→内核态)​​※关键劣势​
​内存占用​仅需源数据缓冲区源数据 + libc内部缓冲区(通常额外 4KB-2MB)
​吞吐量 (64MB)​3.0 – 4.0 GB/s2.5 – 3.5 GB/s (-15%)
​写入延迟​更低(无中间缓冲)稍高(需填充libc缓冲区)
​线程安全性​需手动加锁​自带线程锁​​(安全但可能阻塞)

​详细解析​

1. fwrite() 的额外开销来源

  • ​二次拷贝开销​
    fwrite() 工作流程: // fwrite 内部伪代码 memcpy(libc_buffer, user_data, chunk_size); // 第1次拷贝(用户内存→libc缓冲区) if (libc_buffer_full) { write(fd, libc_buffer, buffer_size); // 第2次拷贝(libc缓冲区→内核) }​对 64MB 数据​​:
    • 若 libc 缓冲区默认 8KB,需 ​​8192次拷贝 + 8192次 write 调用​​(性能灾难!)
    • 若手动调大缓冲区(如 setvbuf(..., _IOFBF, 64MB)),仍多​​1次全量内存拷贝​
  • ​线程锁开销​
    fwrite() 内部有互斥锁(FLOCKFILE_CANCELSAFE),高并发时可能成为瓶颈。

2. write() 的优势场景

  • ​单次大块写入时​​: // 直接调用 write(最优) write(fd, data_64m, 64 * 1024 * 1024);
    • ​0 额外拷贝​​(仅用户态→内核态 1 次必要拷贝)
    • ​0 额外内存分配​​(无需 libc 缓冲区)
    • ​1 次系统调用​
  • ​实测性能差距(Linux + SSD 环境)​​ 操作write(64MB)fwrite(64MB)
    (默认缓冲)fwrite(64MB)
    (64MB缓冲)系统调用次数1​​8192​​1内存拷贝次数18193 (1+8192)​​2​​吞吐量3.8 GB/s0.6 GB/s3.0 GB/s延迟 (64MB)17 ms105 ms22 ms

​何时使用 fwrite 更合适?​

  1. ​写入小块数据(< 4KB)​
    libc 缓冲减少系统调用次数,提升性能 // 写入1000次1KB数据:fwrite 优于 write for(int i=0; i<1000; i++) { fwrite(chunk_1k, 1, 1024, fp); // 缓冲满后才触发write }
  2. ​需要格式化写入时​fprintf(fp, "%s:%d\n", name, value); // fwrite无法替代
  3. ​不追求极限性能的通用代码​
    fwrite 提供跨平台安全性和便捷性。

​最佳实践建议​

✅ 16MB/64MB 大块写入场景:

// 方案1(最优):直接 write + 单次大块
write(fd, big_data, size);

// 方案2(备用):若必须用stdio,手动调大缓冲区
setvbuf(fp, NULL, _IOFBF, 64 * 1024 * 1024);  // 全缓冲+64MB缓冲区
fwrite(big_data, 1, size, fp);             // 仍多1次拷贝,但减少系统调用

❌ 绝对避免:

// 默认缓冲区的fwrite(系统调用次数爆炸)
fwrite(data_64m, 1, 64 * 1024 * 1024, fp);    // 默认缓冲=8KB时,性能暴跌!

​性能优化关键点​

  1. ​对齐内存地址​​(对两者均有效) void *buf; posix_memalign(&buf, 4096, 64 * 1024 * 1024); // 4K对齐提升拷贝效率
  2. ​异步写入降低延迟​// Linux io_uring 方案(超越write/fwrite) struct io_uring ring; io_uring_prep_write(&ring, fd, data, size, offset);
  3. ​禁用 fsync 除非必需​
    内核异步刷盘比同步刷盘快 10x 以上。

结论

​对 16MB/64MB 单次内存块写入:​

  • ​追求极致性能 → 选 write()​(节省拷贝 + 避免锁)
  • 通用场景 → 可接受 fwrite()(但需手动设置大缓冲区)
  • ​默认缓冲区的 fwrite 性能最差,必须避免​
发表在 linux文章 | 留下评论