open3000服务器排查项目,记一次服务器故障排查

本文讲述了作者如何诊断并解决了一起由于Confluence备份文件占满/var目录,导致Jenkins构建卡住及服务器负载升高的问题。通过清理旧备份,调整备份目录和周期,并编写脚本来维护备份文件数量,最终成功恢复了Jenkins服务并优化了服务器性能。

一同事M因127服务器上Jenkins无法构建成功来找我,说:构建卡住了。

访问127的Jenkins取消同事M的构建进程,重构建一次,发现确实是卡住的,查看Jenkins日志无异常。

想起群里上周有人说127服务器cpu和io不高,负载超高,无法ps,找不到原因,寻求帮助,当时因在处理其他事情没回复。

c2f77da76235

image.png

使用top发现,负载90多-比上周高了,sar看到的信息正常,df -lh查看磁盘空间-没有看到使用100%的。

唯一可疑的就是Jenkins所在目录/var已使用97%,只有4.5G的可用空间,理论上排除空间不足而上下文切换频繁产生的负载高,但/var目录总空间为197G,一般情况下这个目录不会有这么大的使用量,所以还不能排除嫌疑。

于是对/var目录进行排查,查看哪个目录有大文件,发现是confluence(一个文档管理应用)目录使用了80多G,一层层目录(du -sh /var/*)查进去看到是/var/atlassian/confluence/application-data/confluence/backups 使用了60G左右,是一个备份目录,单个备份文件大小12G,日志是每日凌晨2点多生成,可以确定是一个每日备份的目录。

假设:/var空间可用80G,备份文件一个12G,每日生成一个,也就是到第7天的时候 就会因为空间不足而无法备份,进程就会卡住,在第8天定时任务又会运行备份,然后进程又卡住了,负载就会越来越高。

到这里就可以确定,找到问题的原因了,处理起来就非常容易,因无法ps 看不到cron的进程,第一反应重启服务器(重启服务器过程卡住了-耽搁10分钟,手动进行了重启。)

第一步:停掉confluence

第二步:删除掉老的备份,只留了最新的一个

第三步:更改备份目录的配置,目录改到/opt为数据盘空大。

/var/atlassian/confluence/application-data/confluence/backups

改成/opt/atlassian/confluence/application-data/confluence/backups

第四步:移动/var/atlassian/confluence/application-data 到/opt/atlassian/confluence 目录下

第五步:启动confluence

第六步:将confluence每日备份 改成每月1日2点备份(管理界面更改cron)==需要根据使用频率来决定备份的周期,当前confluence主要查文档,上传/修改文档较少,可以不用每日备份。

第七步:写一个脚本,每日0点检查backups的目录,保留最新的2个备份文件即可,其他的删除。

#!/bin/bash -l

DATADIR=/opt/atlassian/confluence/application-data/confluence/backups/

cd ${DATADIR}

declare -i filesum=`ls backup-*.zip | wc -l`

declare -i delnum=$filesum-2

if [ "${delnum}" -ge 1 ];then

rm -rf `ls -tr backup-*.zip* | sort | head -${delnum}`

fi

因为/var空间足够了,重新对Jenkins上的项目进行构建也不卡了。

没有使用复杂的技术,Jenkins恢复到可用-花费40分钟,confluence处理好-花费50分钟。

根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
在使用 open62541 构建的 OPC UA 服务器时,服务器连接状态(例如上下线信息)是监控系统运行状况的重要手段。open62541 提供了丰富的日志功能和回调接口,可以用于实现对连接状态的跟踪。 ### 配置日志级别 open62541 支持多种日志级别,包括 `UA_LOGLEVEL_TRACE`、`UA_LOGLEVEL_DEBUG`、`UA_LOGLEVEL_INFO`、`UA_LOGLEVEL_WARNING` 和 `UA_LOGLEVEL_ERROR`。通过设置合适的日志级别,可以捕获到与连接相关的事件信息。例如,将日志级别设置为 `UA_LOGLEVEL_DEBUG` 可以获得更详细的调试信息,包括客户端连接和断开连接的通知: ```c UA_Log_Stdout_setLevel(UA_LOGLEVEL_DEBUG); ``` ### 使用连接状态回调 open62541 提供了一个机制,允许用户注册回调函数来处理特定的事件。对于连接状态的变化,可以通过注册一个自定义的 `UA_ServerConfig_setCustomHostname` 函数以及 `UA_ServerConfig_setAccessControl` 函数中的相关参数来实现。然而,直接监听连接状态变化的功能需要利用到 `UA_Server_registerCallback` 方法,并指定 `UA_SERVER_CALLBACKTYPE_SESSION_ACTIVATED` 或 `UA_SERVER_CALLBACKTYPE_SESSION_CLOSED` 类型的回调,这可以用来追踪会话的激活和关闭事件: ```c static void sessionActivatedCallback(UA_Server *server, UA_Session *session) { UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Session activated for user %.*s", (int)session->userName.length, session->userName.data); } static void sessionClosedCallback(UA_Server *server, UA_Session *session) { UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Session closed for user %.*s", (int)session->userName.length, session->userName.data); } // 注册回调 UA_ServerConfig *config = UA_Server_getConfig(server); config->sessionActivatedCallback = sessionActivatedCallback; config->sessionClosedCallback = sessionClosedCallback; ``` ### 自定义日志录 除了依赖内置的日志系统外,还可以通过编写自定义的日志函数来进一步控制日志输出。这样做的好处是可以将日志信息写入文件或发送到远程服务器,便于后续分析。要创建自定义日志函数,首先需要定义一个新的 `UA_Logger` 结构体实例,并将其绑定到服务器配置中: ```c void customLog(UA_LogLevel level, UA_LogCategory category, const char *msg, va_list args) { // 实现自定义日志逻辑 printf("[%s] %s\n", UA_LogLevel_names[level], msg); } // 设置自定义日志器 UA_Logger logger = {customLog, NULL}; UA_Server_setLogger(server, &logger); ``` ### 示例代码 下面是一个完整的示例,展示了如何结合上述技术来open62541 服务器的连接状态: ```c #include <open62541/server.h> #include <open62541/plugin/log_stdout.h> // 回调函数定义 static void sessionActivatedCallback(UA_Server *server, UA_Session *session) { UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Session activated for user %.*s", (int)session->userName.length, session->userName.data); } static void sessionClosedCallback(UA_Server *server, UA_Session *session) { UA_LOG_INFO(UA_Log_Stdout, UA_LOGCATEGORY_USERLAND, "Session closed for user %.*s", (int)session->userName.length, session->userName.data); } int main(void) { UA_Server *server = UA_Server_new(); UA_ServerConfig *config = UA_Server_getConfig(server); // 设置日志级别 UA_Log_Stdout_setLevel(UA_LOGLEVEL_DEBUG); // 注册回调 config->sessionActivatedCallback = sessionActivatedCallback; config->sessionClosedCallback = sessionClosedCallback; // 启动服务器 UA_StatusCode retval = UA_Server_run(server, &shouldStop); UA_Server_delete(server); return (int)retval; } ``` 以上方法可以帮助开发者有效地监控 open62541 服务器的连接状态,并根据实际需求调整日志录的方式。这些技术不仅有助于维护系统的稳定性,还能为故障排查提供有力的支持。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值