蚊章汇 - 监控
type: channel
link: https://linuxcn.bwsl.wang/tag/%E7%9B%91%E6%8E%A7/
items: 如何在 Linux 中监控用户活动
items: 在不到 30 分钟内构建一个树莓派监控仪表盘
items: Sniffnet：任何人都可以使用的有趣的开源网络监控工具
items: 如何监测微型的网站服务
items: 将 Zeek 与 ELK 栈集成
items: 系统监控中心：一个理想的 Linux 任务管理器和资源监视器
items: Below：一个时间旅行的资源监控器
items: 在终端监控你的 Linux 系统
items: 我如何用 CircuitPython 和开源工具监控温室
items: 从零写一个时间序列数据库

如何在 Linux 中监控用户活动
type: item
date: 2023-10-19T18:59:47+08:00
description: 作为一位 Linux 管理员，你需要跟踪所有用户的活动。当服务器发生故障时，你可以分析和查看用户活动，以便寻找问题的根源。监控 Linux 用户有多种方式。本指南将专门讨论 GNU 记账工具，这是一项用于监视 Linux 用户活动的实用工具。什么是记账工具？记账工具可以提供诸如 Linux 系统中的连接、已执行的程序以及系统资源的使用等有底系统使用信息。这些记账工具可以通过 psacct 或 acct 软件包安装。psacct 和 acct 实际上是相同的。在基于 RPM 的系统中，它以 psacct 的形式存在；而在基于 DEB 的系统中，它作为 acct 提供。你可能想知道 psacct 或 acct 工具的作用。通常，用户在命令行的历史记录会保存在他们的 $HOME 目录下的 .bash_history 文件中。有些用户可能会尝试编辑、修改或删除这些历史记录。然而，即使他们完全 清除了命令行历史，记账工具依然能够获取用户活动信息。这是因为，所有进程记账文件都由 root 用户拥有，而普通用户则无法进行编辑。Linux 中如何安装 psacct 或 acctpsacct/acct 被打包在多种流行的 Linux 发行版本中。如果要在 Alpine Linux 中安装 psacct，请运行以下命令：$ sudo apk add psacct 如果在 Arch Linux 及其变体版本（如 EndeavourOS 和 Manjaro Linux）中安装 acct，请运行以下命令：$ sudo pacman -S acct 在 Fedora、RHEL 及其衍生版本（如 CentOS、AlmaLinux 和 Rocky Linux）中安装 psacct，请运行以下命令：$ sudo dnf install psacct 在 RHEL 6 以及更早版本中，你应当使用 yum 命令而非 dnf 来安装 psacct。$ sudo yum install psacct 在 Debian、Ubuntu 以及 Linux Mint 中，通过如下命令来安装 acct：$ sudo apt install acct 若在 openSUSE 中安装 acct，则运行：$ sudo zypper install acct 启动 psacct/acct 服务要启用并开启 psacct 服务，请执行以下命令：$ sudo systemctl enable psacct 接着启动 psacct 服务：$ sudo systemctl start psacct 如果你需要检查 psacct 服务是否已加载和激活，可以运行：$ sudo systemctl status psacct 在基于 DEB 的系统中，安装完成之后，acct 服务会自动启动。如果你想验证 acct 服务是否已经启动，可以执行以下命令：$ sudo systemctl status acct ● acct.service - Kernel process accounting Loaded: loaded (/lib/systemd/system/acct.service; enabled; vendor preset: enabled) Active: active (exited) since Thu 2022-10-13 16:06:35 IST; 28s ago Docs: man:accton(8) Process: 3241 ExecStart=/usr/sbin/accton /var/log/account/pacct (code=exited, status=0/SUCCESS) Main PID: 3241 (code=exited, status=0/SUCCESS) CPU: 879us Oct 13 16:06:35 ubuntu2204 systemd[1]: Starting Kernel process accounting... Oct 13 16:06:35 ubuntu2204 accton[3241]: Turning on process accounting, file set to '/var/log/account/pacct'. Oct 13 16:06:35 ubuntu2204 systemd[1]: Finished Kernel process accounting. 利用 psacct 或 acct 来监测 Linux 中的用户活动psacct（进程记账）软件包包含以下用来监测用户和进程活动的工具：ac - 提供用户登录时间的统计信息。lastcomm - 展示先前执行过的命令的信息。accton - 开启或关闭进程记账。du…

在不到 30 分钟内构建一个树莓派监控仪表盘
type: item
date: 2023-07-10T18:29:00+08:00
description: 使用 Python 制作一个 API 来监控你的树莓派硬件，并使用 Appsmith 建立一个仪表盘。如果你想知道你的树莓派的性能如何，那么你可能需要一个树莓派的仪表盘。在本文中，我将演示如何快速构建一个按需监控仪表盘，以实时查看你的树莓派的 CPU 性能、内存和磁盘使用情况，并根据需要随时添加更多视图和操作。如果你已经使用 Appsmith，你还可以直接导入 示例应用程序 并开始使用。AppsmithAppsmith 是一个开源的 低代码 应用构建工具，帮助开发人员轻松快速地构建内部应用，如仪表盘和管理面板。它是一个用于仪表盘的很好选择，并减少了传统编码方法所需的时间和复杂性。在此示例的仪表盘中，我显示以下统计信息：CPU占用百分比频率或时钟速度计数温度内存占用百分比可用内存百分比总内存空闲内存磁盘磁盘使用百分比绝对磁盘空间使用量可用磁盘空间总磁盘空间创建一个端点你需要一种从树莓派获取这些数据并传递给 Appsmith 的方法。psutil 是一个用于监控和分析的 Python 库，而 Flask-RESTful 是一个创建 REST API 的 Flask 扩展。Appsmith 每隔几秒钟调用 REST API 以自动刷新数据，并以 JSON 对象作为响应，其中包含所有所需的统计信息，如下所示：{ "cpu_count": 4, "cpu_freq": [ 600.0, 600.0, 1200.0 ], "cpu_mem_avail": 463953920, "cpu_mem_free": 115789824, "cpu_mem_total": 971063296, "cpu_mem_used": 436252672, "cpu_percent": 1.8, "disk_usage_free": 24678121472, "disk_usage_percent": 17.7, "disk_usage_total": 31307206656, "disk_usage_used": 5292728320, "sensor_temperatures": 52.616 } 1、设置 REST API如果你的树莓派尚未安装 Python，请在树莓派上打开终端并运行此安装命令：$ sudo apt install python3 现在为你的开发设置一个 Python 虚拟环境：$ python -m venv PiData 接下来，激活该环境。你必须在重新启动树莓派后执行此操作。$ source PiData/bin/activate $ cd PiData 为了安装 Flask、Flask-RESTful 和以后需要的依赖项，请在你的 Python 虚拟环境中创建一个名为 requirements.txt 的文件，并将以下内容添加到其中：flask flask-restful gunicorn 保存文件，然后使用 pip 一次性安装它们。你必须在重新启动树莓派后执行此操作。(PyData)$ python -m pip install -r requirements.txt 接下来，创建一个名为 pi_stats.py 的文件来存放使用 psutil 检索树莓派系统统计信息的逻辑。将以下代码粘贴到 pi_stats.py 文件中：from flask import Flask from flask_restful import Resource, Api import psutil app = Flask(__name__) api = Api(app) class PiData(Resource): def get(self): return "RPI Stat dashboard" api.add_resource(PiData, '/get-stats') if __name__ == '__main__': app.run(debug=True) 这段代码的作用如下：使用 app = Flask(name) 来定义嵌套 API 对象的应用程序。使用 Flask-RESTful 的 API 方法 来定义 API 对象。在 Flask-RESTful 中将 PiData 定义为具体的 Resource 类 ，以公开每个支持的 HTTP 方法。使用 api.add_resource(PiData, '/get-stats') 将资源 PiData 附加到 API 对象 api。每当你访问 URL /get-stats 时，将返回 PiData 作为响应。2、使用 psutil 读取统计信息要从你的树莓派获取统计信息，你可以使用 psutil 提供的这些内置函数：cpu_percentage、cpu_count、cpu_freq …

Sniffnet：任何人都可以使用的有趣的开源网络监控工具
type: item
date: 2023-06-15T00:38:51+08:00
description: 使用这个方便的应用查看你的网络连接。嗅探，嗅探，那是什么？ ?这是我在系统上看到的可疑网络连接吗？ ?❌你可能想知道我如何查看系统上的网络活动。 嗯，当然，一些 系统监控工具 应该有所帮助。但是，如果我想要更多详细信息怎么办？好吧，我遇到了一个不错的工具 Sniffnet。 它是一个用于实时监控网络活动的简洁的开源应用，也是专有的 GlassWire（如 Portmaster）的一个很好的替代品。那么，让我们深入挖掘吧！Sniffnet：概述 ⭐Sniffnet 是一个基于 Rust 的网络监控工具，可让你跟踪通过系统的所有互联网流量。 它提供了一些非常有用的功能，高级用户肯定会喜欢这些功能**。当你第一次启动 Sniffnet 时，你会看到一个菜单来选择网络适配器、过滤器和应用协议。完成选择后，单击“火箭”按钮开始。这是概览页的样子。它显示了所有当前的网络连接，以及一个方便的流量图，供你分析流量。? 你可以选择将数据显示为字节或单个数据包。要更深入地查看你的网络连接，你可以前往“ 检查 Inspect ”选项卡。在这里，你将看到一个包含所有重要信息的列表，例如 IP 地址、数据包数量、数据量、来源国家等等。你可以单击各个连接获得更详细的情况。如果你想为更具体的目的过滤结果怎么办？好吧，那么你可以使用“检查”选项卡下的过滤器选项根据你的需要过滤结果。你可以通过以下方式过滤列表： 应用、国家、域名等。这是它的样子：Sniffnet 还可以向你显示可以以文本格式导出的连接的详细报告。只需单击右下角带有页面/向右箭头的徽标即可开始。可定制性如何？好吧，Sniffnet 有一组不错的设置供你调整。第一个是“通知”选项卡，它允许你根据可以设置的各种阈值来设置通知的行为。然后是可以通过“ 样式 Style ”选项卡访问的主题。它提供四种选择，雪人之夜是我的最爱。最后，“ 语言 Language ”选项卡允许你设置你选择的界面语言。好了，就此结束。Sniffnet 是一个方便的工具，可以非常详细地了解系统上的网络活动。你可以使用它来监控你的网络。此外，与另一个网络监控工具 Nutty 相比，在我看来，Sniffnet 的使用和设置要直观得多。? 获取 SniffnetSniffnet 可跨多个平台使用，包括 Linux、Windows 和 macOS。 你可以前往官方网站获取你选择的安装包。Sniffnet如果愿意，你还可以在 GitHub 上仔细查看其源代码。via: https://news.itsfoss.com/sniffnet/作者：Sourav Rudra 选题：lkxed 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

如何监测微型的网站服务
type: item
date: 2022-07-18T18:58:49+08:00
description: 你好! 我最近又开始运行一些服务器（nginx playground、mess with dns、dns lookup），所以我一直在考虑监控问题。最初我并不完全清楚如何监控这些网站，所以我想快速写下我是如何做到的。我根本不打算谈如何监控大型的、严肃的关键任务网站，只谈微型的不重要的网站。目标：在操作上几乎不花时间我希望网站大部分时间都能正常工作，但我也希望不用在持续的运营上花费时间。我最初对运行服务器非常警惕，因为在我的上一份工作中，我是 24/7 轮流值班，负责一些关键的服务，在我的印象中，“负责服务器”意味着“在凌晨 2 点被叫起来修理服务器”和“有很多复杂的仪表盘”。所以有一段时间我只做静态网站，这样我就不用考虑服务器的问题。但最终我意识到，我所要写的任何服务器的风险都很低，如果它们偶尔宕机 2 小时也没什么大不了的，我只需设置一些非常简单的监控来帮助它们保持运行。没有监控很糟糕起初，我根本没有为我的服务器设置任何监控。这样做的结果是非常可预见的：有时网站坏了，而我却没有发现，直到有人告诉我！步骤 1：uptime 检查器第一步是建立一个 uptime 检查器。外面有很多这样的东西，我现在使用的是 updown.io 和 uptime robot。我更喜欢 updown 的用户界面和 定价 结构（它是按请求而不是按月收费），但 uptime 机器人有一个更慷慨的免费套餐。它们会：检查网站是否正常如果出现故障，它会给我发电子邮件我发现电子邮件通知对我来说是一个很好的通知级别，如果网站宕机，我会很快发现，但它不会吵醒我或做其它的什么打扰。步骤 2：端到端的健康检查接下来，让我们谈谈“检查网站是否正常”到底是什么意思。起初，我只是把我的健康检查端点之一变成一个函数，无论如何都会返回 200 OK。这倒是挺有用的 – 它告诉我服务器是启动着的！但不出所料，我遇到了问题，因为它没有检查 API 是否真的在 工作 – 有时健康检查成功了，尽管服务的其他部分实际上已经进入了一个糟糕的状态。所以我更新了它，让它真正地发出 API 请求，并确保它成功了。我所有的服务都只做了很少的事情（nginx playground 只有一个端点），所以设置一个健康检查是非常容易的，它实际上贯穿了服务应该做的大部分动作。下面是 nginx playground 的端到端健康检查处理程序的样子。它非常基本：它只是发出一个 POST 请求（给自己），并检查该请求是成功还是失败。 func healthHandler(w http.ResponseWriter, r *http.Request) { // make a request to localhost:8080 with `healthcheckJSON` as the body // if it works, return 200 // if it doesn't, return 500 client := http.Client{} resp, err := client.Post("http://localhost:8080/", "application/json", strings.NewReader(healthcheckJSON)) if err != nil { log.Println(err) w.WriteHeader(http.StatusInternalServerError) return } if resp.StatusCode != http.StatusOK { log.Println(resp.StatusCode) w.WriteHeader(http.StatusInternalServerError) return } w.WriteHeader(http.StatusOK) } 健康检查频率：每小时一次现在，我大部分健康检查每小时运行一次，有些每 30 分钟运行一次。我每小时运行一次，因为 updown.io 的定价是按健康检查次数计算的，我正在监控 18 个不同的 URL，而且我想把我的健康检查预算保持在 5 美元/年的最低水平。花一个小时来发现这些网站中的一个出现故障，对我来说是可以的 – 如果有问题，我也不能保证能很快修复它。如果可以更频繁地运行它们，我可能会每 5-10 分钟运行一次。步骤 3：第三步：如果健康检查失败，自动重新启动我的一些网站在 fly.io 上，fly 有一个相当标准的功能，我可以为一个服务配置一个 HTTP 健康检查，如果健康检查失败，就重新启动服务。“经常重启”是一个非常有用的策略来弥补我尚未修复的 bug，有一段时间，nginx playground 有一个进程泄漏，nginx 进程没有被终止，所以服务器的内存一直在耗尽。通…

将 Zeek 与 ELK 栈集成
type: item
date: 2022-06-29T00:45:57+08:00
description: Zeek 是一个开源的网络安全监控工具。本文讨论了如何将 Zeek 与 ELK 集成。在本杂志 2022 年 3 月版发表的题为“用 Zeek 轻松实现网络安全监控”的文章中，我们研究了 Zeek 的功能，并学习了如何开始使用它。现在我们将把我们的学习经验再进一步，看看如何将其与 ELK（即 Elasticsearch、Kibana、Beats 和 Logstash）整合。为此，我们将使用一个叫做 Filebeat 的工具，它可以监控、收集并转发日志到 Elasticsearch。我们将把 Filebeat 和 Zeek 配置在一起，这样后者收集的数据将被转发并集中到我们的 Kibana 仪表盘上。安装 Filebeat让我们首先将 Filebeat 与 Zeek 安装在一起。使用 apt 来安装 Filebeat，使用以下命令：sudo apt install filebeat 接下来，我们需要配置 .yml 文件，它位于 /etc/filebeat/ 文件夹中：sudo nano /etc/filebeat/filebeat.yml 我们只需要在这里配置两件事。在 Filebeat 输入部分，将类型改为 log，并取消对 enabled:false 的注释，将其改为 true。我们还需要指定存储日志的路径，也就是说，我们需要指定 /opt/zeek/logs/current/*.log。完成这些后，设置的第一部分应该类似于图 1 所示的内容。第二件要修改的事情是在输出下的 Elasticsearch 输出部分，取消对 output.elasticsearch 和 hosts 的注释。确保主机的 URL 和端口号与你安装 ELK 时配置的相似。我们把它保持为 localhost，端口号为 9200。在同一部分中，取消底部的用户名和密码的注释，输入安装后配置 ELK 时生成的 Elasticsearch 用户的用户名和密码。完成这些后，参考图 2，检查设置。现在我们已经完成了安装和配置，我们需要配置 Zeek，使其以 JSON 格式存储日志。为此，确保你的 Zeek 实例已经停止。如果没有，执行下面的命令来停止它：cd /opt/zeek/bin ./zeekctl stop 现在我们需要在 local.zeek 中添加一小行，它存在于 opt/zeek/share/zeek/site/ 目录中。以 root 身份打开该文件，添加以下行：@load policy/tuning/json-logs.zeek 参考图 3，确保设置正确。由于我们改变了 Zeek 的一些配置，我们需要重新部署它，这可以通过执行以下命令来完成：cd /opt/zeek/bin ./zeekctl deploy 现在我们需要在 Filebeat 中启用 Zeek 模块，以便它转发 Zeek 的日志。执行下面的命令：sudo filebeat modules enable zeek 我们几乎要好了。在最后一步，配置 zeek.yml 文件要记录什么类型的数据。这可以通过修改 /etc/filebeat/modules.d/zeek.yml 文件完成。在这个 .yml 文件中，我们必须提到这些指定的日志存放在哪个目录下。我们知道，这些日志存储在当前文件夹中，其中有几个文件，如 dns.log、conn.log、dhcp.log 等等。我们需要在每个部分提到每个路径。如果而且只有在你不需要该文件/程序的日志时，你可以通过把启用值改为 false 来舍弃不需要的文件。例如，对于 dns，确保启用值为 true，并且路径被配置：var.paths: [ “/opt/zeek/logs/current/dns.log”, “/opt/zeek/logs/*.dns.json” ] 对其余的文件重复这样做。我们对一些我们需要的文件做了这个处理。我们添加了所有主要需要的文件。你也可以这样做。请参考图 4。现在是启动 Filebeat 的时候了。执行以下命令：sudo filebeat setup sudo service filebeat start 现在一切都完成了，让我们移动到 Kibana 仪表板，检查我们是否通过 Filebeat 接收到来自 Zeek 的数据。进入仪表板。你可以看到它所捕获的数据的清晰统计分析（图 5 和图 6）。现在让我们进入发现选项卡，通过使用查询进行过滤来检查结果：event.module: "zeek" 这个查询将过滤它在一定时间内收到的所有数据，只向我们显示名为 Zeek 的模块的数据（图 7）。鸣谢作者感谢 VIT-AP 计算机科学与工程学院的 Sibi Chakkaravarthy Sethuraman、Sudhakar Ilan…

系统监控中心：一个理想的 Linux 任务管理器和资源监视器
type: item
date: 2021-12-10T21:05:00+08:00
description: “系统监控中心”是一个多合一的开源应用，不用使用多种工具就可以监控基本的系统资源情况。在 Linux 上以图形方式监控系统资源可能体验不是很好，这些与你的桌面环境相配套的系统监控工具可能细节有限。例如，GNOME 的系统监视器不显示 CPU 频率和温度。此外，Linux 的默认系统监控程序通常以简单为目标，而不是提供详细的信息。“ 系统监控中心 System Monitoring Center ” 是一个有用的 GUI 工具，它提供了大量必要的信息。在这篇文章中，让我给你详细介绍一下它。系统监控中心：显示基本系统统计信息的 Linux 应用系统监控中心是一个基于 GTK3 和 Python 3 的外观时尚的应用，它为你提供了你想要的所有资源使用数据。在我的例子中，我想在使用系统监控工具时关注 CPU 的频率，但 GNOME 的系统监控工具提供不了帮助。所以，这个应用就非常有用了。该应用的用户体验良好，并提供了大量的信息和功能。让我重点介绍一下它的主要功能。写这篇文章时，该应用程序仍处于测试阶段。因此，你可能会遇到一些错误。然而，我在简短的测试中没有注意到任何问题。系统监控中心的功能首先，它可以让你查看 CPU、内存、磁盘、网络、GPU 和传感器的单独统计数据。你可以在该工具中看到以下细节信息：显示 CPU 状态，包括频率能够显示平均使用率或每个核心的使用率可以选择 CPU 频率和其他统计的精度能够改变图表的颜色按用户过滤系统进程并轻松管理它们切换一个浮动的摘要小部件，以快速获得信息显示磁盘使用信息和连接的驱动器在同一个应用中显示详细的系统信息控制启动服务和程序能够控制状态更新的时间间隔应用本身的系统资源使用率较低适应系统主题虽然它为每个标签（或组件）提供了大量的选项和自定义功能，但我希望它能在未来的更新中包括 RAM 频率等东西。然而，考虑到它可以同时取代磁盘使用分析器和 neofetch 等终端工具，其余的数据似乎非常有用。请注意，如果你有多个机箱风扇、独立的排风扇或 AIO，你可能无法得到风扇的数据。温度也可能有或没有，但 CPU 的温度应该是可见的。在 Linux 中安装系统监控中心你可以使用可用的 deb 包在任何基于 Ubuntu 的发行版上轻松安装它。不幸的是，没有可用的其他软件包，只有一个 ZIP 文件，你得手动构建和编译才能安装它。你在 ZIP 文件中可以找到一个脚本来构建 RPM 包。deb 文件可以通过 SourceForge 获得。你点击下面的按钮来下载它，或者在他们的 GitLab 页面 找到。下载系统监控中心总结系统监控中心是一个开源应用，可以让用户详细了解他们的系统资源，并帮助管理进程。对于许多 Linux 用户来说，这是一个非常需要的应用，不需要使用单独的终端/GUI 程序就可以提供详细的信息。via: https://itsfoss.com/system-monitoring-center/作者：Ankush Das 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出

Below：一个时间旅行的资源监控器
type: item
date: 2021-10-06T17:31:00+08:00
description: 在这篇文章中，我们将介绍 below：一个用于现代 Linux 系统的 Apache 2.0 许可的资源监视器。below 可以让你重放以前记录的数据。背景内核的主要职责之一是调度对资源的访问。有时这可能意味着分配物理内存，使多个进程可以共享同一主机。其他时候，它可能意味着确保 CPU 时间的公平分配。在这些场景里，内核提供了机制，而将策略留给了“别人”。近来，这个“别人”通常是 systemd 或 dockerd 这样的运行时。运行时接受来自调度器或最终用户的输入（类似于运行什么和如何运行）并在内核上转动正确的旋钮和拉动正确的杠杆，从而使工作负载能够好好工作。在一个完美的世界里，故事就到此结束了。然而，现实情况是，资源管理是一个复杂的、相当不透明的技术混合体，在几十年里计算技术不断发展。尽管其中一些技术有各种缺陷和死角，但最终的结果是，容器运作得比较好。虽然用户通常不需要关心这些细节，但对于基础设施运营商来说，对他们的技术架构拥有可见性是至关重要的。可见性和可调试性对于检测和调查错误的配置、问题和系统性故障至关重要。让事情变得更加复杂的是，资源中断往往难以重现。经常需要花费数周时间等待一个问题重新出现，以便调查其根本原因。规模的扩大进一步加剧了这个问题：我们不能在每台主机上运行一个自定义脚本，希望在错误再次发生时记录下关键状态的片段。因此，需要更复杂的工具。这就出现了 below。动机历史上，Facebook 一直是 atop 的忠实用户。atop 是一个用于 Linux 的性能监视器，能够报告所有进程的活动以及各种系统级活动。与 htop 等工具相比，atop 最引人注目的功能之一是能够作为一个守护程序记录历史数据。这听起来是一个简单的功能，但在实践中，这使得调试无数的生产问题成为可能。有了足够长的数据保留，就有可能在时间上回溯，查看在问题或故障发生之前、期间和之后的主机状态。不幸的是，随着时间的推移，人们发现atop 有某些不足之处。首先， 控制组 cgroup 已经成为控制和监视 Linux 机器上资源的实际方式。atop 仍然缺乏对这一基本构建模块的支持。第二，atop 用自定义的 delta 压缩方法在磁盘上存储数据。这在正常情况下运行良好，但在沉重的资源压力下，主机很可能会丢失数据点。由于使用了 delta 压缩，在数据最重要的时间段内，数据可能会大面积丢失。第三，用户体验有一个陡峭的学习曲线。我们经常听到 atop 的资深用户说，他们喜欢密集的布局和众多的键盘绑定。然而，这也是一把双刃剑。当一个刚进入这个领域的人想要调试一个生产问题时，他们现在要同时解决两个问题：手头的问题和如何使用 atop。below 是由 Facebook 的资源控制团队为其设计和开发的，并得到了 atop 生产环境用户的支持。顾名思义，资源控制团队负责的是规模化的资源管理。该团队由内核开发人员、容器运行时开发人员和硬件人员组成。认识到下一代系统监控器的机会，我们在设计 below 时考虑到以下几点：易用性：below 必须既能为新用户提供直观的体验，又能为日常用户提供强大的功能。 *有意义的统计数据：below 显示准确和有用的统计数据。即便可以，但我们尽量避免收集和倾倒统计数字。灵活性：当默认设置不合适时，我们允许用户自定义他们的体验。例如包括可配置的键绑定、可配置的默认视图，以及脚本界面（默认为终端用户接口）。安装安装该软件包：# dnf install -y below 打开记录守护进程：# systemctl enable --now below 快速介绍below 最常用的模式是重放模式。顾名思义，重放模式是重放以前记录的数据。假设你已经启动了记录守护程序，那么通过运行以下程序启动一个会话：$ below replay --time "5 minutes ago" 然后你会看到控制组视图：如果你不知道该怎么操作，或者忘记了一个键位，按 ? 可以进入帮助菜单。屏幕的最上方是状态栏。状态栏显示关于当前样本的信息。你可以通过按 t 和 T 分别向前和向后移动样本。中间的部分是系统概览。系统概览包含了关于整个系统的统计数据，一般来说，这些数据总是很有用的。第三部分也是最下面的部分是多用途视图。上面的图片显示了控制组视图。此外，还有进程和系统视图，分别通过按 p 和s 来访问。按 ↑ 和 ↓ 来移动列表选择。按回车键来折叠和展开控制组。假设你发现了一个感兴趣的控制组，你想看看它里面有哪些进程在运行。要放大进程视图，选择控制组并按 z：再按 z 返回到控制组视图。这个视图有时会有点长。如果你对你要找的东西有一个模糊的概念，你可以通过按 / 并输入一个过滤器来过滤控制组名称。在这一点上，你可能已经注意到了一个我们还没有探索过的标签系统。要在…

在终端监控你的 Linux 系统
type: item
date: 2021-08-24T17:30:32+08:00
description: 如何找到一个程序的进程 ID（PID）。最常见的 Linux 工具是由 procps-ng 包提供的，包括 ps、pstree、pidof 和 pgrep 命令。在 POSIX 术语中， 进程 process 是一个正在进行的事件，由操作系统的内核管理。当你启动一个应用时就会产生一个进程，尽管还有许多其他的进程在你的计算机后台运行，包括保持系统时间准确的程序、监测新的文件系统、索引文件，等等。大多数操作系统都有某种类型的系统活动监视器，因此你可以了解在任何特定时刻有哪些进程在运行。Linux 有一些供你选择，包括 GNOME 系统监视器和 KSysGuard。这两个软件在桌面环境都很有用，但 Linux 也提供了在终端监控系统的能力。不管你选择哪一种，对于那些积极管理自己电脑的人来说，检查一个特定的进程是一项常见的任务。在这篇文章中，我演示了如何找到一个程序的进程 ID（PID）。最常见的工具是由 procps-ng 包提供的，包括 ps、pstree、pidof 和 pgrep 命令。查找一个正在运行的程序的 PID有时你想得到一个你知道正在运行的特定程序的进程 ID（PID）。pidof 和 pgrep 命令可以通过命令名称查找进程。pidof 命令返回一个命令的 PID，它按名称搜索确切的命令：$ pidof bash 1776 5736 pgrep 命令允许使用正则表达式：$ pgrep .sh 1605 1679 1688 1776 2333 5736 $ pgrep bash 5736 通过文件查找 PID你可以用 fuser 命令找到使用特定文件的进程的 PID。$ fuser --user ~/example.txt /home/tux/example.txt: 3234(tux) 通过 PID 获得进程名称如果你有一个进程的 PID 编号，但没有生成它的命令，你可以用 ps 做一个“反向查找”：$ ps 3234 PID TTY STAT TIME COMMAND 5736 pts/1 Ss 0:00 emacs 列出所有进程ps 命令列出进程。你可以用 -e 选项列出你系统上的每一个进程：PID TTY TIME CMD 1 ? 00:00:03 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:00 rcu_gp 4 ? 00:00:00 rcu_par_gp 6 ? 00:00:00 kworker/0:0H-events_highpri [...] 5648 ? 00:00:00 gnome-control-c 5656 ? 00:00:00 gnome-terminal- 5736 pts/1 00:00:00 bash 5791 pts/1 00:00:00 ps 5792 pts/1 00:00:00 less (END) 只列出你的进程ps -e 的输出可能会让人不知所措，所以使用 -U 来查看一个用户的进程：$ ps -U tux | less PID TTY TIME CMD 3545 ? 00:00:00 systemd 3548 ? 00:00:00 (sd-pam) 3566 ? 00:00:18 pulseaudio 3570 ? 00:00:00 gnome-keyring-d 3583 ? 00:00:00 dbus-daemon 3589 tty2 00:00:00 gdm-wayland-ses 3592 tty2 00:00:00 gnome-session-b 3613 ? 00:00:00 gvfsd 3618 ? 00:00:00 gvfsd-fuse 3665 tty2 00:01:03 gnome-shell [...] 这样就减少了 200 个（可能是 100 个，取决于你运行的系统）需要分类的进程。你可以用 pstree 命令以不同的格式查看同样的输出：$ pstree -U tux -u --show-pids [...] ├─gvfsd-metadata(3921)─┬─{gvfsd-metadata}(3923) │ └─{gvfsd-metadata}(3924) ├─ibus-portal(3836)─┬─{ibus-portal}(3840) │ └─{ibus-portal}(3842) ├─obexd(5214) ├─pulseaudio(3566)─┬─{pulseaudio}(3640) │ ├─{pulseaudio}(3649) │ └─{pulseaudio}(5258) ├─tracker-store(4150)─┬─{tracker-store}(4153) │ ├─{tracker-store}(…

我如何用 CircuitPython 和开源工具监控温室
type: item
date: 2021-06-20T23:20:28+08:00
description: 使用微控制器、传感器、Python 以及 MQTT 持续追踪温室的温度、湿度以及环境光。CircuitPython 提供了一种和微控制器板进行交互的革命性方式。这篇文章介绍了如何使用 CircuitPython 来监测温室的温度、湿度以及环境光，并且使用 CircuitPython MQTT 客户端将结果发布到一个 MQTT 中介 broker 。你可以在若干个程序中订阅 MQTT 队列并进一步处理信息。这个项目使用一个简单的 Python 程序来运行 Web 服务器，它发布一个 Prometheus 格式的采集端点，拉取监控指标到 Prometheus 进行不间断的监控。关于 CircuitPythonCircuitPython 是一个由 Adafruit 创建的开源 Python 发行版，用于运行在低成本微控制器开发板上。CircuitPython 为与 兼容的开发板 的交互提供了简单的开发体验。你可以在连接你的开发板时挂载的 CIRCUITPYTHON 根驱动器上创建一个 code.py 文件来启动你的程序。CircuitPython 还为开发板提供了一个串行连接，包含一个交互式解释器（REPL）会话，你可以使用 Python 代码实时和开发板进行交互。Adafruit 的网站提供了大量的文档，可以帮助你开始使用 CircuitPython。首先，参考下《欢迎来到 CircuitPython》指南。这份指南能够帮助你开始使用 CircuitPython 在开发板上运行代码以及和 REPL 交互。它还记录了如何安装 Adafruit 的 CircuitPython 库合集和范例，可以用在它出售的许多开发板和传感器上。接下来，阅读《CircuitPython 基础》指南来学习更多关于其功能的信息，里面还有链接指向在特定及兼容的开发板上使用 CircuitPython 的相关信息。最后，就如所有开源软件一样，你可以深入 CircuitPython 的源码，发布议题，以及做出贡献。微控制器设置微控制器系统非常简单。要完成这个示例项目，你会需要：树莓派 4：你需要一台电脑来给微控制器系统编程，我用的是树莓派 4。CircuitPython 兼容的微控制器：我用的是 Adafruit Feather S2，带有内置 WiFi，环境光传感器，Qwiic 线缆输入。微控制器 WiFi：Feather S2 内置了 WiFi。如果你的微控制器没有，你需要给开发板找个 WiFi 扩展板。传感器：Feather S2 有个内置的环境光传感器，所以我还需要一个温湿度传感器。有很多不同厂商的产品可以选择，包括 Adafruit、SparkFun、亚马逊。我用的是一个 Adafruit 传感器，带有 Feather S2 输入兼容的 Qwiic 线缆。尽管多数 SparkFun 传感器可以在 Adafruit 库下工作，但如果你不是从 Adafruit 购买的传感器，你可能还是需要自己去找到它兼容 CircuitPython 的 Python 库。跳线和线缆：为了避免使用面包板或焊接，我使用 Adafruit Qwiic 线缆。SparkFun 销售的包含不同长度的线缆套装中也有它。在将微控制器连接到你的电脑之前，将传感器连接到微控制器上。现在你可以将微控制器用 USB 数据线连接到你的电脑。MQTT 中介你可以使用 这份说明 来在树莓派的系统上安装 Mosquitto MQTT 中介 和 Mosquitto 客户端。如果你想把树莓派做为长期服务器使用，在你的网络上给树莓派 4 设置一个静态 IP 地址。Mosquitto 中介运行起来之后，创建一份 用户名/密码文件，设置客户端向中介发布和订阅消息时用的认证信息。你可以用树莓派上的 Mosquitto 客户端来测试 MQTT 中介。打开两个终端（如果你是无界面运行的话打开两个 SSH 会话）：在终端一输入：mosquitto_sub -h localhost -u $user -P $pass -t "mqtt/test" 这条命令会启动一个持续运行的进程，监听发布到 mqtt/test 队列的消息。在终端二输入：mosquitto_pub -h localhost -u $user -P $pass -t "mqtt/test" -m hello` 这条命令会向 mqtt/test 队列发布一条消息，它应该会显示在终端一的输出里。现在你可以中止终端一运行的 sub 命令了。Mosquitto 中介允许客户端发布消息到任何队列，甚至没有任何订阅的队列也可以。这些消息会永久丢失，但这不会阻止客户端继续发布消息。打开第三个终端，订阅下列队列（你的控制器会发布消息到这些队列上）：greenhouse/t…

从零写一个时间序列数据库
type: item
date: 2019-06-12T02:08:00+08:00
description: 编者按：Prometheus 是 CNCF 旗下的开源监控告警解决方案，它已经成为 Kubernetes 生态圈中的核心监控系统。本文作者 Fabian Reinartz 是 Prometheus 的核心开发者，这篇文章是其于 2017 年写的一篇关于 Prometheus 中的时间序列数据库的设计思考，虽然写作时间有点久了，但是其中的考虑和思路非常值得参考。长文预警，请坐下来慢慢品味。我从事监控工作。特别是在 Prometheus 上，监控系统包含一个自定义的时间序列数据库，并且集成在 Kubernetes 上。在许多方面上 Kubernetes 展现出了 Prometheus 所有的设计用途。它使得 持续部署 continuous deployments ， 弹性伸缩 auto scaling 和其他 高动态环境 highly dynamic environments 下的功能可以轻易地访问。查询语句和操作模型以及其它概念决策使得 Prometheus 特别适合这种环境。但是，如果监控的工作负载动态程度显著地增加，这就会给监控系统本身带来新的压力。考虑到这一点，我们就可以特别致力于在高动态或 瞬态服务 transient services 环境下提升它的表现，而不是回过头来解决 Prometheus 已经解决的很好的问题。Prometheus 的存储层在历史以来都展现出卓越的性能，单一服务器就能够以每秒数百万个时间序列的速度摄入多达一百万个样本，同时只占用了很少的磁盘空间。尽管当前的存储做的很好，但我依旧提出一个新设计的存储子系统，它可以修正现存解决方案的缺点，并具备处理更大规模数据的能力。备注：我没有数据库方面的背景。我说的东西可能是错的并让你误入歧途。你可以在 Freenode 的 #prometheus 频道上对我（fabxc）提出你的批评。问题，难题，问题域首先，快速地概览一下我们要完成的东西和它的关键难题。我们可以先看一下 Prometheus 当前的做法 ，它为什么做的这么好，以及我们打算用新设计解决哪些问题。时间序列数据我们有一个收集一段时间数据的系统。identifier -> (t0, v0), (t1, v1), (t2, v2), (t3, v3), ....每个数据点是一个时间戳和值的元组。在监控中，时间戳是一个整数，值可以是任意数字。64 位浮点数对于计数器和测量值来说是一个好的表示方法，因此我们将会使用它。一系列严格单调递增的时间戳数据点是一个序列，它由标识符所引用。我们的标识符是一个带有 标签维度 label dimensions 字典的度量名称。标签维度划分了单一指标的测量空间。每一个指标名称加上一个唯一标签集就成了它自己的时间序列，它有一个与之关联的 数据流 value stream 。这是一个典型的 序列标识符 series identifier 集，它是统计请求指标的一部分：requests_total{path="/status", method="GET", instance=”10.0.0.1:80”} requests_total{path="/status", method="POST", instance=”10.0.0.3:80”} requests_total{path="/", method="GET", instance=”10.0.0.2:80”}让我们简化一下表示方法：度量名称可以当作另一个维度标签，在我们的例子中是 __name__。对于查询语句，可以对它进行特殊处理，但与我们存储的方式无关，我们后面也会见到。{__name__="requests_total", path="/status", method="GET", instance=”10.0.0.1:80”} {__name__="requests_total", path="/status", method="POST", instance=”10.0.0.3:80”} {__name__="requests_total", path="/", method="GET", instance=”10.0.0.2:80”}我们想通过标签来查询时间序列数据。在最简单的情况下，使用 {__name__="requests_total"} 选择所有属于 requests_total 指标的数据。对于所有选择的序列，我们在给定的时间窗口内获取数据点。在更复杂的语句中，我们或许想一次性选择满足多个标签的序列，并且表示比相等条件更复杂的情况。例如，非语句（method!="GET"）或正则表达式匹配（method=~"PUT|POST"）。这些在很大程度上定义了存储的数据和它的获取方式。纵与横在简化的视图中，所有…