如何排查常规软件问题 - 面向 Linux 初级用户的教程

news2024/11/27 16:53:23

笔者从 14 年做开源软件以来,接触了众多 Linux 新手用户,这里我为这类用户总结了一些常见的问题排查方法,希望能帮助到大家。如果你已经工作多年,对于下面提到的思路和方法应该非常熟悉,如果对某一条感到陌生,咳咳,真的不太应该,赶紧补补吧。

1. 软件资料获取

第一条是告诉大家去哪里获取软件文档资料,别笑,很多新手就是不知道去哪里找,一上来就 baidu、google,结果搜到很多不靠谱的资料,浪费了很多时间。

  • 官网:首先你得知道软件官网在哪里,一切都从这里开始。文档、下载地址,通常都在官网有入口
  • Github:如果软件是开源的,那么它的源码通常在 Github 上,你可以在 Github 上找到软件的源码、历史问题、历史版本等资料,以 Nightingale 项目举例,其 Github 截图以及相关信息如下:

20240125172851

这个页面继续往下滚动,可以看到 README,开源项目的 README 的每一行信息都值得读一下,很多人 README 都不读就敢用也是非常头铁。

2. 软件安装相关

首先,一定要严格按照文档建议去操作,如果遇到问题,下面这些小 tips 或许能够帮到你。

2.1 检查进程

ps -ef | grep prometheus

首先要确认进程是否启动,可以使用 ps 命令查看,grep 后面的 prometheus 表示二进制文件名,这里 prometheus 只是举例,你要换成你自己的二进制文件名。

2.2 检查端口

ss -tlnp | grep 9090

有的时候进程虽然在,但是端口没有在监听,也不正常,比如 Prometheus 默认监听在 9090 端口,通过上面的 ss 命令可以查看 9090 端口是否在正常监听。

2.2 检查 CPU 架构

有的机器是 x86 的,有的是 arm 的,检查你是否下载错了。通过下面的命令可以查看本机的 CPU 架构:

uname -m

如果输出是 x86_64 就要下载 amd64 的包,如果是 aarch64 就要下载 arm 的包。

2.3 检查版本

大部分软件都会提供查看版本的方式,比如 cprobe:

ulric@ulric-flashcat cprobe % ./cprobe -version
0.0.1-2024-01-25-17-44-37

如果不知道如何查看版本,可以使用 --help 参数,基本所有的软件都会提供 --help 参数来查看帮助信息,比如:

./cprobe --help

这个 help 信息非常非常关键,即便刚开始不能全部阅读,也要大体看一眼软件提供了哪些命令行参数。

2.4 检查配置文件

大部分软件都会提供配置文件,下载包里通常会有一个默认配置,在改动之前一定要先备份一下,改动之后,如何确认改动了哪些部分?可以使用 diff 或 vimdiff 命令来对比一下,比如:

vimdiff config.toml config.toml.bak

假设 config.toml 是改过的配置文件,config.toml.bak 是原始配置文件,通过 vimdiff 查看:

20240125175130

很明显能看到 config.toml 改动了端口,原来是 9090,改成了 19090,非常方便。你要检查配置文件的改动是否符合预期,别多了字符少了字符啥的,以及缩进是否正确,yaml 配置对缩进就非常敏感。通过两次 :q + 回车 可以退出 vimdiff。

2.5 检查日志

出问题看日志是基本素养。软件如果启动不起来,通常会在控制台直接打印日志。比如 Nightingale,你这么启动的话出错了就会在控制台直接输出错误消息:

ulric@ulric-flashcat nightingale % ./n9e 
runner.cwd: /Users/ulric/works/gopath/src/nightingale
runner.hostname: ulric-flashcat.local
runner.fd_limits: (soft=61440, hard=unlimited)
runner.vm_limits: (soft=unlimited, hard=unlimited)
2024-01-25 17:56:07.392349 DEBUG ormx/ormx.go:58 /Users/ulric/works/gopath/src/nightingale/pkg/ormx/ormx.go:93
[error] failed to initialize database, got error dial tcp 127.0.0.1:3306: connect: connection refused
2024-01-25 17:56:07.392477 DEBUG ormx/ormx.go:68 /Users/ulric/works/gopath/src/nightingale/pkg/ormx/ormx.go:93
[error] failed to initialize database, got error dial tcp 127.0.0.1:3306: connect: connection refused
2024/01/25 17:56:07 main.go:39: failed to initialize: dial tcp 127.0.0.1:3306: connect: connection refused

上面的错误也很典型:connection refused 表示连接被拒绝,通常就是目标端口没有在监听,上面的例子的话,就是 127.0.0.1:3306 没有在监听,即本机的 MySQL 没有在监听。

./n9e 这种启动方式是进程前台启动,有错误会输出在控制台,但是 terminal 关掉,进程就退出了,一般生产环境启动会使用 systemd 来托管,此时,使用下面的命令可以查看 n9e 的进程状态:

systemctl status n9e

通过下面的命令可以查看 n9e 的日志:

journalctl -fu n9e

journalctl 的更多用法,请自行 baidu、google。

如果你不是 systemd 来托管的进程,而是采用 nohup 启动的,比如:

nohup ./n9e &> stdout.log &

显然,标准输出和标准错误输出都重定向到 stdout.log 了,启动不了就查看 stdout.log 即可。当然,进程本身可能会把一些日志写到指定的日志目录,日志目录下的日志也要关注。

如果你的进程启动都起不来,此时就不要用 systemd 或者 nohup 启动了,就直接前台启动测试即可,可以更清楚的查看日志。

3. 软件运行相关

软件正常启动之后,如果又遇到问题,通常就是看页面报错以及运行日志。页面报错是必须要会看的,页面报错之后第一反应应该是打开 Chrome 开发者工具,切到 Network Tab,勾选 Preserve log 和 Disable cache,重新操作一遍页面功能,看看到底是向后端发了啥请求,哪些请求报错了,报错的请求具体发出了什么 request,返回了什么 response。

20240125184716

另外,在请求上右键,可以选择 Copy -> Copy as cURL,这样就可以把请求复制成 curl 命令,可以在命令行里执行。

20240125184836

这个功能有何用处呢?有时请求经过了四层负载均衡、七层负载均衡才能最终到达服务端进程,有时我们怀疑是中间某个链路的问题,却没有证据,此时就可以拷贝 curl 这个命令,修改 ip:port 为后端进程的 IP 和端口,然后直接到进程所在机器上执行,看看是否能复现问题,如果能复现,说明是后端进程的问题,如果不能复现,那就是中间某个链路的问题。

如果是后端进程的问题,就要看进程日志了,异常报错通常都会有日志输出。这里就很考验经验了。

比如看到 “Resource temporarily unavailable” 我们就知道是 ulimit 设置不合理。怎么查看进程的 ulimit 呢?找到进程的 pid,查看 /proc/<pid>/limits 文件即可,比如下面的例子,查看 cprobe 进程的 ulimit 限制:

[root@dev-n9e-01 ~]# cat /proc/`pidof cprobe`/limits
Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        unlimited            unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             30039                30039                processes
Max open files            65536                65536                files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       30039                30039                signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

如果是 ulimit 限制,那么就要修改 ulimit 了,修改 ulimit 的方式,可以自行 baidu、google。

比如进程请求 MySQL 的时候报错 “Too many connections”,那么就是 MySQL 的连接数限制了,可以通过 show variables like '%max_connections%'; 来查看 MySQL 的连接数限制,默认是 151,可以通过 set global max_connections=1000; 来修改。当然,只用 set 命令修改重启就不生效了,还需要修改 MySQL 的配置文件使其重启也能生效。

当然,常见的问题很多,这里也没法一一举例,通常看到报错之后,要认认真真的读报错,实在弄不明白就 google、gpt,如果还不行,再问同事等其他有经验的人。问题见的越多,技术成长越快。

另外,如果报错并非 Linux 常规报错,是软件业务逻辑的报错,这就需要你弄懂软件的架构和数据流了,然后根据架构和数据流,来猜想、求证,最终定位问题。如果实在搞不定,可以去 github 上提 issue,提 issue 的时候一定要写清楚复现步骤,并写清楚你做了哪些验证,得到了哪些结果,这样别人才好帮你。提问也是一门艺术,建议 google 一下 “raymond 提问的艺术”。

4. 其他杂项问题

时间校准问题。很多分布式软件,特别是监控系统,对时间校准是有严苛要求的,注意校准机器的时间,除了服务端的时间,还要注意校准你的浏览器所在 pc 的时间。

5. 小结

一时半会儿想到这么多,后续想到了再补充。也欢迎大家在留言里补充,相互学习~

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

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

相关文章

视频美颜SDK开发指南:从入门到精通的技术实践

美颜SDK是一种强大的工具&#xff0c;它不仅仅可以让用户在实时视频中获得光滑的肌肤和自然的妆容&#xff0c;从简单的滤镜到复杂的人脸识别&#xff0c;美颜SDK涵盖了广泛的技术领域。 一、美颜SDK的基本原理 美颜SDK包括图像处理、人脸检测和识别、滤镜应用等方面。掌握这些…

瑞_23种设计模式_抽象工厂模式

文章目录 1 抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;1.1 概念1.2 介绍1.3 小结1.4 结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 总结4.1 抽象工厂模式优缺点4.2 抽象工厂模式使用场景4.3 抽象工厂模式 VS 工厂方法模式4.4 抽象工…

ywtool dhcp命令

一.dhcp功能介绍 就是通过脚本实现dhcp地址池的增、删、改、查这几个功能日志文件路径: /var/log/ywtools/ywtool-dhcp.log/usr/local/ywtools/config/config.ini中account参数(ywtool dhcp这个命令用的,但是这个命令只能配置1个地址池,所以这里面的参数没什么意义) 二.配置…

超维机器人年终总结大事记回顾

2023年&#xff0c;对于超维机器人来说&#xff0c;是充满挑战和机遇的一年。在这一年里&#xff0c;我们攻坚克难&#xff0c;持续创新&#xff0c;深度聚焦智能巡检机器人的发展&#xff0c;加强合作伙伴关系&#xff0c;不断优化产品和服务&#xff0c;不断提升客户体验&…

幻兽帕鲁联机服务器 - 小白部署教程

简介&#xff1a; 本文将基于阿里云&#xff0c;介绍如何最低以24元的成本拥有一台幻兽帕鲁私人服务器 1. 基础部署幻兽帕鲁服务器 1.1 访问帕鲁专题活动页 首先登录阿里云官网&#xff1a;阿里云特惠专区-幻兽帕鲁专属云服务器 用钉钉或者支付宝app扫码注册新用户&#xff…

django微博热搜数据分析与可视化系统python毕业设计

简而言之&#xff0c;数据可视化是以图形方式呈现结构化或非结构化数据&#xff0c;从而将隐藏在数据中的信息直接呈现给人们。但是有一个陷阱:它不仅仅是使用数据可视化工具将数据转化为图形。相反&#xff0c;它是从数据的角度看待世界。换句话说&#xff0c;数据可视化的对象…

第三篇:跨平台QT开发-容器

Qstring Qstring的隐式共享 隐式数据共享机制去最大化资源有效利用和最小化复制克隆操作。隐式共享类当作为函数参数传递的时候&#xff0c;不 仅安全而且效率很高&#xff0c;因为传递的时候只是传递的数据的指针&#xff0c;数据本身只当自己被修改的时候才会去复制。简称写时…

One time pad 图像加密MATLAB程序

使用一次加密的形式对图像进行加密。 采用异或的方式实现。 加密、解密结果如下: 程序代码如下: % 读取原始图像并显示 originalImage = imread(lena256.bmp); % 更换为你的图像文件名 subplot(1,3,1),imshow(originalImage); title(Original Image);% 生成与图像相同大…

【ROS机器人系统】实验1 熟悉ROS操作系统、熟悉ROS通信架构

文章目录 实验1 熟悉ROS操作系统、熟悉ROS通信架构1、实验目的2、实验设备3、实验内容3.1 安装ROS3.2 ROS常用指令以及小海龟示例roscore命令rosrun命令rosnode 命令roscd 命令rostopic 命令 动手实现1&#xff1a;rosservice 命令roslaunch 命令 动手实现2&#xff1a;动手实现…

Android Studio 安装Flutter插件但是没法创建项目

Android Studio 安装Flutter插件但是没法创建项目 如果你在Android Studio已经安装了Dart、Flutter插件&#xff0c;但是不能创建Flutter项目。 原因是因为Android Studio的版本更新&#xff0c;Android APK Support这个插件没被选中。 一旦勾选这个插件之后&#xff0c;就能…

leetcode 3.无重复字符的最长字串(滑动窗口) (C++)DAY2

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示…

天猫数据分析:2023年坚果炒货市场年销额超71亿,混合坚果成多数消费者首选

近年来&#xff0c;随着人们生活水平和健康意识的提升&#xff0c;在休闲零食市场中&#xff0c;消费者们也越来越关注食品的营养价值&#xff0c;消费者这一消费偏好的转变也为坚果炒货食品行业带来了发展契机。 整体来看&#xff0c;坚果炒货市场的体量较大。根据鲸参谋电商…

【Linux】EXT2文件系统 | 磁盘分区块组 | inode

文章目录 一、前言二、EXT2文件系统 - 逻辑存储结构&#x1f4be;分区&#xff08;Partition&#xff09;分区的概念每个分区的内容Linux下查询磁盘分区 &#x1f4be;块组&#xff08;Block Group&#xff09;磁盘格式化每个块组的内容1. Superblock&#xff08;超级块&#x…

5.0 HDFS 集群服务建立教程

HDFS 集群是建立在 Hadoop 集群之上的&#xff0c;由于 HDFS 是 Hadoop 最主要的守护进程&#xff0c;所以 HDFS 集群的配置过程是 Hadoop 集群配置过程的代表。 使用 Docker 可以更加方便地、高效地构建出一个集群环境。 每台计算机中的配置 Hadoop 如何配置集群、不同的计…

vue2 el-table新增行内删除行内(两种写法)里面第一个是树组件,第二个是数字组件,第一个数组件只能勾选最后一个节点

第一种 <template><div class"time_table"><div style"margin-bottom: 10px"><el-button click"addRowFn">新增</el-button></div><el-form ref"costForm" :model"formData">&l…

云原生数据库 GaiaDB 的核心技术演进和解析

导读 在越来越强调云原生的环境下&#xff0c;存算分离作为一种新的架构理念&#xff0c;已经是大势所趋。新的技术架构带来新的问题和挑战&#xff0c;百度智能云的云原生数据库 GaiaDB 采用 Quorum 分布式协议、高性能网络、高可靠分布式存储引擎等技术实现更高的性能和可用性…

[开源]GPT Boss – 用图形化的方式部署您的私人GPT镜像网站

在这个以数据和智能为核心的时代&#xff0c;掌握最新的技术趋势是每个企业和个人都需要做到的。这就是GPT Boss存在的意义&#xff1a;一个基于OpenAI技术的一站式GPT应用解决方案。 自2022年起&#xff0c;GPT Boss团队便投身于人工智能领域&#xff0c;将OpenAI的GPT模型带给…

Bard 最新更新:全球开放访问Gemini Pro并生成图片

深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领域的领跑者。点击订阅&#xff0c;与未来同行&#xff01; 订阅&#xff1a;https://rengongzhineng.io/ 。 今…

2024/2/4学习记录

微信小程序 网络数据请求 出于安全性方面的考虑&#xff0c;小程序官方对数据接口得请求做出了俩个限制 只能对 https 类型的接口必须将接口的域名添加到信任列表中 需要去这里设置 域名只支持 https 协议域名不能使用 ip 地址 或者localhost域名必须经过 ICP 备案 服务器域…

在 iOS 上安装自定企业级应用

了解如何安装您的组织创建的自定应用并为其建立信任。 本文适用于学校、企业或其他组织的系统管理员。 您的组织可以使用 Apple Developer Enterprise Program 创建和分发企业专用的 iOS 应用&#xff0c;以供内部使用。您必须先针对这些应用建立信任后&#xff0c;才能将其打…