结构化文档发布的故事和性能调优

news2024/10/6 8:40:53

前阵子一个TW朋友跟我抱怨他们的文档发布很慢。正常发布需要一个晚上才能完成发布。中间如果出点错,就得重新发布,那么中间是漫长的等待。 

不像MS Word或者InDesign这样所见即所得的软件,结构化文档源文件是XML格式的,就像计算机代码一样,不能直接使用。想要使用,必须先发布成PDF、HTML、ePub等格式。想起从业这些年,围绕着结构化文档的发布发生过很多故事,今天就来聊聊这个话题。

- 1 -

小A的故事

先来分享一个故事。有一个朋友,暂且叫小A,他们公司建设了结构化文档系统。发布的XML文件倒不大,一个文件生成的PDF有20-30页这样子,一个包里有200来个这样的文件,这样的包一天要发很多。关键的是这个发布程序不能出问题,因为后边的工作是等着这个文件才能展开的。如果发布不出来会直接影响企业的运行。

不巧的是这个发布程序有时候会无缘无故卡住,一旦卡住不管等多久都不会有结果。他们也找过实施方案的供应商,但是找不到卡住的原因,唯一的修复办法是重启服务器(万能的重启大法)。

小A是负责人,文档发布不出来下游的人就会找他,这可让他苦坏了。修复问题的办法倒也简单明了,但是就是每天过得提心吊胆的,随时准备着远程登录到服务器重启。休假的时候也要随身带着电脑,电话一响就紧张。

 

这样的日子过了好久。后来他告诉我他们找到一个解决办法,就是做一个定时重启服务器的程序,每天凌晨3点在不执行发布任务的时候重启服务器。 

回想这个故事,首先是难过,感叹小A这些年过得不容易;其次是再次提醒我结构化文档发布程序稳定的重要性。

- 2 -

文档发布过程

作为TW,当文档发布很慢的时候,我们能做点什么事情呢?

毕竟术业有专攻,文档工程师的主业是文档创作,软件系统的事情可以找IT部门或者供应商。但是,了解一下内幕,我们会变得不那么被动。也可以从自己能把控的方面(比如:调整内容),为顺利发布提供帮助。

以将DITA文档发布为例,发布成HTML的过程是这样的:

发布成PDF的过程则有些不同,是这样的:

发布过程中发布HTML很少出问题,出问题最多的是发布PDF。主要的原因是因为发布HTML的时候是一个topic一个topic地处理的。发布PDF则需要将所有的topic合成为一个文件,然后处理。当发布文档很大,比如:上万页,这对服务器的CPU、内存和磁盘提出了考验。

这就像小孩子吃饭,一小口一小口地吃没有问题;如果一下子将嘴里塞满东西,吃得就慢了,甚至会噎住。

- 3 -

性能分析和调优

遇到这种情况怎么办呢?总的来说,分析和性能调优思路是这样的:

上图中,1.1, 1.2, 2.1, 2.2, 2.3都是TW能操作或者能协调的;2.4和2.5则难度比较高,需要寻求系统建设者的帮助。

下边是一些细节,TW了解一下即可。

怎样检查服务器硬件资源是否被利用起来?

不管是物理服务器或者云服务器,都有监控的功能。比如,下边这个是阿里云服务器的监控信息:

 

 

从这里,我们可以看到服务器近段时间资源利用的曲线图。特别关注这三个指标:1)CPU使用率, 2)内存使用率, 3)磁盘读写情况。

如果这三个资源利用率都很低(小于30%),则是服务器硬件资源没有被利用起来。 

1.1调整设置和1.2升级发布引擎

1) 调整发布程序的内存设置

很多发布程序是使用一种叫Java的语言开发的,默认情况下最大内存是1G。这个时候即使你的服务器有16G,它也只会使用1G。那么,可以将内存设置成10G(需要留些给操作系统和其他程序使用)。如果是32G的服务器,则可设置成26G。

2) 配置可同时运行的发布任务数

发布程序一般同时可以执行多个发布任务。CPU利用率很低代表计算能力没有用上,也就是CPU在那等活儿干。适当地增加同时可执行的发布任务数,让CPU忙起来。 

要注意的是发布引擎一般是按照CPU核来卖的(这也是很多服务器软件的商业模式)。免费的程序可能只能用1个CPU核。价格越高,支持的核越多。核越多表示同一时刻发布程序能使用CPU越多,这样能执行的任务也越多。

如果发布任务数提高了,CPU利用率还很低,那么可以看看购买的发布引擎,并考虑是否需要升级。

2.1升级服务器硬件

硬件资源的成本每年是成递减趋势的,所以如果升级服务器硬件能解决的问题,就不要动软件,这样成本最低。

2.2将文档拆分,让发布的文件变小,好发布和2.3将文档中的图形精度降低,让图形文件变小

这两个措施都是减小发布程序的工作量,让它在可承受的范围内完成它的工作。TW可考虑:

  • 我的文档能否分成2个或者多个文档或者部分呢?每个文档或者部分单独发布成一个PDF文件,这样一个文档由多个PDF组成。

  • 我文档中的图精度是否没必要那么高呢?曾经碰到过过一个图达近100M,后来打开文件将图形尺寸缩小,将图大小放在5M以内可以大大提高发布效率?

2.4样式代码分析和调优

这里虽然叫样式(Stylesheet),但是其实中间是有数据处理逻辑的,它由编程语言实现,如:XSLT。

合格的程序员都知道快速排序比冒泡排序效率高。但开发样式的小伙伴一般很少是计算机科班出生,不一定知道。

开发样式表的时候,不会考虑到内存和CPU的占用的问题。一不小心一个嵌套就能吃掉一大块内存却浑然不知,或者让CPU白忙活一阵却做的无用功。

这时,可以让懂程序开发的小伙伴帮样式开发人员分析样式处理逻辑中内存和CPU利用的问题。 

2.5改装发布程序,用多台服务器支持发布,然后合成

这个难度最高,轻易不要考虑使用这种方式。 因为它需要系统架构师、高级工程师以及高级样式开发配合,而且开发和维护成本可能很高。 这里就不展开了。 

- 4 -

最后的话

不知道小A最近过得怎么样,不知那个发布程序是否还那么恼人,得打个电话问问。

希望每个TW都能够顺利发布自己的文档,过上无牵挂的日子。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/598562.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言——数据在内存中的存储(下)

数据在内存中的存储(下) 1. 浮点数在内存中的存储 浮点数家族: float double long double 浮点数的表示范围: 这里要引用float.h头文件 【实例一】 //输出结果是什么? int main() {int n 9;float *pFloat (float…

【代码规范】Google开源项目风格指南

系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于Google开源项目风格指南进行的,每个知识点的修正和深入…

基于卡尔曼滤波实现线性目标跟踪

文章目录 前言卡尔曼滤波基本推导运算 实现目标检测卡尔曼预测器ID分配器(跟踪器) 完整代码代码总结 前言 一个需求,在一个稳定的场景当中,实现目标检测计数算法。 任务点: 实现目标检测完成对不同类别的物品进行计数…

Three.js--》实现3d字体模型展示

目录 项目搭建 初始化three.js基础代码 设置环境纹理 加载字体模型 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还是借助框架书写…

前后端交互模型http协议Ajax简介

0、前言:本文只是对“前后端交互模型&http协议&Ajax简介”当中的理论,作用,方法进行总结说明,用于回顾知识,做概括总结,没有具体实现代码。 1、前后端交互模型: 前端发送请求&#xff…

信号机制上(信号概念、发送、定时器、信号捕捉、SIGCHLD)

一、信号机制 概念:信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式 所有信号的产生及处理全部都是由内核完成的 信号的产生: 1 按键产生 2 系统调用函数产生(比如raise, kill) 3 硬件异…

连接MQTT服务端

MQTT客户端之间要想实现通讯,必须要通过MQTT服务端。因此MQTT客户端无论是发布消息还是订阅消息,首先都要连接MQTT服务端。 MQTT客户端连接服务端一共有两步。 第一步(CONNECT请求) 首先MQTT客户端将会向服务端发送连接请求。该…

HBase 的关键流程解析

前言 本文隶属于专栏《大数据技术体系》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见大数据技术体系 正文 HBase 客户端会将查询过的 HRegion 的位置信息…

【Python爬虫】采集电商商品评价信息

目录 一、数据采集逻辑二、数据Schema三、数据爬取1.导入库2.对爬虫程序进行伪装3.抓取商品评论信息4.防止反爬,每爬取一页数据后,设置程序休眠环节 四、数据存储1. 存储到csv 2.存储到数据库 一、数据采集逻辑 在进行数据采集之前,明确哪些…

Linux下C语言文件描述符操作(dup / dup2 / sendfile / splice / tee)

Linux的哲学是一切皆文件&#xff0c;而操作文件是通过文件描述符来进行。本文梳理一下dup / dup2 / sendfile / splice/ tee函数对文件描述符的操作。 目录 1.dup 2.dup2 3.sendfile 4.splice 5.tee 1.dup #include <unistd.h> int dup(int fd); 复制一个现有的…

Java基础(maven)——maven新建项目 常用IO工具 Durid数据库工具 案例

目录 引出用Maven建项目0.Maven配置方式1.io流的工具IOUtils/FileUtils1&#xff09;可以读文件、按照行读、读网页等&#xff1b;2&#xff09;配合hasmap进行简体繁体转换 2.durid数据库连接工具1&#xff09;创建连接&#xff0c;durid进行连接管理2&#xff09;查询的方式q…

chatgpt赋能python:Python中的转置函数-一种简单而高效的矩阵操作

Python中的转置函数 - 一种简单而高效的矩阵操作 作为一名10年的Python编程经验工程师&#xff0c;掌握利用Python进行矩阵操作是必不可少的。Python中提供了各种高效的矩阵操作功能&#xff0c;其中之一就是转置函数。 什么是转置&#xff1f; 在数学中&#xff0c;矩阵转置…

追寻幸福:探索幸福的关键特征和行为

目录 1. 积极的心态 2. 良好的人际关系 3. 自我接纳和自尊 4. 追求意义和目标 5. 健康的身心状态 6. 感知和实现个人价值 幸福是一个主观的感受&#xff0c;因此不同的人对于幸福的定义和追求方式可能会有所不同。然而&#xff0c;有一些共同的特点和行为模式&#xff0c…

【数据结构】难度上一个台阶的二叉树实现

【数据结构】难度上一个台阶的二叉树实现 一、什么是树和二叉树&#xff1f;二、目标三、实现3.1、初始化工作3.2、二叉树的前序遍历3.2.1、原理图解3.2.2、代码实现 3.3、二叉树的创建3.3.1、原理解析3.3.2、代码实现 3.4、二叉树的中序遍历3.5、二叉树的后序遍历3.6、二叉树的…

K8S系列文章之快速入门K8S

搭建K8S环境 前置 目前生产部署Kubernetes 集群主要有两种方式&#xff1a; kubeadm Kubeadm 是一个K8s 部署工具&#xff0c;提供kubeadm init 和kubeadm join&#xff0c;用于快速部署Kubernetes 集群。 官方地址&#xff1a;https://kubernetes.io/docs/reference/setu…

ChatGPT出来后,为什么老有人想让我们程序员失业?

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步…

【LeetCode每日一题】——1248.统计「优美子数组」

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 滑动窗口 二【题目难度】 中等 三【题目编号】 1248.统计「优美子数组」 四【题目描述】 给…

NVIDIA NCCL 源码学习(十)- 多机间ncclSend和ncclRecv的过程

先回忆一下单机的执行流程&#xff0c;用户执行ncclSend之后通过ncclEnqueueCheck将sendbuff&#xff0c;sendbytes&#xff0c;peer等信息保存到了comm->p2plist中&#xff1b;然后执行ncclGroupEnd&#xff0c;如果发现channel没有建立到peer的链接则先建链&#xff0c;然…

深入理解设计原则之接口隔离原则(ISP)

系列文章目录 C高性能优化编程系列 深入理解设计原则系列 深入理解设计模式系列 高级C并发线程编程 LSP&#xff1a;接口隔离原则 系列文章目录1、接口隔离原则的定义和解读2、案例解读3、如何判断一个接口是否符合接口隔离原则&#xff1f;小结 1、接口隔离原则的定义和解读…

网络工程师一定要会关键技能:如何进行IP子网划分?

对于所有从事IP网络方面工作的工程师来说&#xff0c;进行IP子网划分操作属于一个必备的关键技能&#xff0c;也属于必须掌握的专业内容&#xff1b;但对于初学者来说&#xff0c;真正理解IP子网划分的概念也是一件相当困难的事情。 怎样才能正确地进行子网划分操作 IP子网划…