当前位置: 首页 > news >正文

洞悉 Linux 系统运行细节,使用 atop 监测和回看系统负载状态

Linux系统的资源使用情况,你可以通过使用命令如freetopnetstat来实时监控内存、CPU及端口的使用状态。对于需要追踪历史资源消耗动态的场景,atop命令则能有效帮助用户查看过去的系统负载情况。

本篇教程的灵感源自一位小伙伴的真实经历:她曾遇到服务器不定期卡顿的问题,没想到腾讯云的客服指导她使用 atop 进行故障排查,结果发现是 dnf-makecache 周期性执行导致的系统卡顿。腾讯云客服的专业性让人印象深刻。鉴于此,本次使用腾讯云的轻量应用服务器详解 atop 的使用,更好地监控服务器性能。

什么是 atop

atop 是一个用于Linux和Unix类操作系统的时间间隔内系统活动分析工具。看它的名字,很容易联想到 Linux 自带的 top,其实确实挺像的,不过与 top 更像的,应该是 btophtopatop 主要是允许用户从命令行界面上查看系统过去的CPU使用率、磁盘I/O、内存与交换分区使用情况。甚至可以记录进程统计以及网络接口活动在内的多种信息。

atop

atop 的 GitHub 项目地址: https://github.com/Atoptool/atop/

对比 top

我们先来看看 top 命令:

# Linux 上 使用 top -h 输出
top -hprocps-ng 3.3.17
Usage:top -hv | -bcEeHiOSs1 -d secs -n max -u|U user -p pid(s) -o field -w [cols]

比如: 我们想看 mintimate 用户的进程占用,就可以使用:

top -u mintimate

top 添加 user 过滤

发现 chromium 的进程比较多,这个时候,还可以用 ps 命令查看端口号:

# ps 命令查看
ps aux | grep 'chromium'
# 再秀一下(o′ω`o)ノ,ps 过滤 chromium 并 kill
ps aux | grep 'chromium' | grep -v grep | awk '{ print $2 }' | xargs kill

你可以看到,top 命令是一个实时展示 Linux 系统中进程活动及其资源占用情况的动态监视工具,无法查看历史数据

至于 atop 的主要特点包括:

  • 自动周期性记录:它可以定期捕获系统活动快照,这些快照可以存储在日志文件中以供日后分析。
  • 历史数据回放:用户能够以类似于“即时”视图的方式浏览过去的数据,其实就是回看历史快照。
  • 丰富的信息展示:提供丰富的系统性能指标,涵盖系统层面的各种活动。
  • 灵活的查询选项:支持对特定时间段内的数据进行筛选和查询。

因此,那些需要深入了解其系统过去一段时间内行为的系统管理员来说,atop 是一个非常有价值的工具。

你可以理解为,是加强且命令行版本的腾讯云控制台监控曲线:
腾讯云监控曲线

区别在于,腾讯云轻量应用服务器控制台的曲线是宏观的,但是 atop 的信息更加细致,可以到进程级别。

选择 atop?

主要的原因,还是 atop 的历史数据回放功能。虽然我们自己也可以用 crontab 来定时记录系统活动快照,但是,atopsystemctl 服务,可以自动记录系统活动快照,而且,atop 还可以自动删除过期的系统活动快照,非常方便。与其自己造造轮子,不如直接使用 atopsystemctl 服务。

其次,还有一个很有趣的事情: 就是粉丝用户的反馈,她说她在用腾讯云的轻量应用服务器,总是不知道为什么,服务器卡顿,腾讯云的客服教她使用 atop 排障,最后发现是服务器内 dnf-makecache 周期性执行,导致系统卡顿,感觉腾讯云的客服很专业,很细心;同时,她想更了解这个工具。

很 Nice 的客服

我是很惊讶的,没想到腾讯云的客服这么专业; 而且这个问题本身,我认为是超出腾讯云服务范围的,本来就是用户自己的事情,但是腾讯云的售后客服还是给出专业的解决方案,让人感觉挺有温度的,也有点小惊喜(o′ω`o)ノ;

我甚至发现腾讯云的官方文档,也有提到 atop 的使用方法: https://cloud.tencent.com/document/product/213/61086。既然官方都这么推荐,我也就详细介绍一下 atop 的使用方法。

操作前提

其实,作为一个命令行工具,atop 本身没什么要求: atop 的第一个发行版本 1.20 版本,对内核的最低要求是 2.6.2。只要你用的是目前主流 Linux,都可以运行 atop,可能版本有所差异,但是不会影响使用。

当然,我推荐使用腾讯云的轻量应用服务器,目前腾讯云的轻量应用服务器 Linux 系统的内核版本都是足够新的,用来实操本教程都是没有问题的:
腾讯云轻量应用服务器

目前正好腾讯云的轻量应用服务器的有活动,可以进去探索一下:

  • 本站专属腾讯云轻量应用服务器: https://curl.mintimate.cn/1Hs6qNOVjJo

比如:我就趁机买了这台轻量应用服务器,体验一下 atop 的使用方法:
我使用的轻量应用服务器

建议新建一台服务器后,登录服务器后,第一时间更新一次软件包管理器。这倒不是腾讯云的轻量应用服务器有问题,而是更新软件包管理器,可以保证软件包是最新的,避免一些潜在的 bug:

# Debian/Ubuntu 系统
apt update && apt upgrade -y
# CentOS/RedHat/OpenCloudOS 系统
yum update && yum upgrade -y

腾讯云 Debian 系统镜像更新软件包管理器

atop 基础使用

其实,atop 大体可以分为两个模式:

  • 实时检测模式: 直接使用 atop 进入 atop 的交互界面,查看实时的数据,并且可以使用命令进行交互。
  • 历史数据模式: 通过预先设定的监控定时器配置,查看历史数据快照。

历史数据模式其实就是历史的实时检测模式快照,所以我们使用 atop 命令,只需要知道 atop 交互模式如何使用,以及配置历史数据模式即可。

交互模式

我们直接使用 atop 进入类似于 top 的交互模式,查看实时数据:

# 进入 atop 交互模式
atop

atop 交互模式

上方是 CPU、内存、磁盘、网络、GPU 的利用率以及使用量。下方是进程列表,以及进程的详细信息。介绍一下常用的字段含义:

  • PID: 进程 ID(Process ID),唯一标识一个进程的编号。
  • CID/POD: 容器 ID 或 Pod 名称,表示进程所属的容器或 Pod。
  • SYSCPU: 系统 CPU 时间,进程在内核态运行所消耗的 CPU 时间。
  • USRCPU: 用户 CPU 时间,进程在用户态运行所消耗的 CPU 时间。
  • RDELAY: 资源延迟时间,进程等待资源(如 CPU、内存、I/O 等)所消耗的时间。
  • BDELAY: 块设备延迟时间,进程等待块设备(如磁盘 I/O)所消耗的时间。
  • VGROW: 虚拟内存增长量,进程的虚拟内存使用量的变化。
  • RGROW: 常驻内存增长量,进程的常驻内存(物理内存)使用量的变化。
  • RDDSK: 读取磁盘的数据量,进程从磁盘读取的数据量。
  • WRDSK: 写入磁盘的数据量,进程向磁盘写入的数据量。
  • RNET: 接收网络数据量,进程从网络接收的数据量。
  • SNET: 发送网络数据量,进程向网络发送的数据量。
  • RUID: 实际用户 ID(Real User ID),启动进程的用户的 ID。
  • EUID: 有效用户 ID(Effective User ID),进程当前运行时的用户 ID。
  • ST: 进程状态(State),表示进程的当前状态(如运行、睡眠、僵尸等)。
  • EXC: 进程的退出代码(Exit Code),进程终止时的退出状态码。
  • THR: 线程数(Threads),进程中当前运行的线程数量。
  • S: 进程的调度优先级(Scheduling priority),进程的调度优先级。
  • CPUNR: CPU 编号(CPU Number),进程当前运行的 CPU 编号。
  • MEM: 内存使用量,进程当前使用的内存量。
  • CMD: 命令行,启动进程的命令行。

这些字段提供了关于系统中各个进程的详细信息,帮助用户监控和分析系统性能。

这个时候,你按下 q 即可退出,或者按住 Ctrl + C 退出。如果你保持这个界面,并不退出,可以按 h 或者 ? 查看帮助信息:

atop 帮助信息

给大家翻译一下:

显示模式:'B'  - 显示系统利用率的条形图(切换)文本模式下关于 cgroups v2 的信息:'G'  - cgroups v2 指标2-7 - cgroups 树级别选择(默认 7)8   - 显示与相关进程的 cgroups,除了内核进程9   - 显示与相关进程的 cgroups'a'  - 显示所有 cgroups/进程,而不仅仅是活跃的(切换)'C'  - 按 CPU 活动排序'M'  - 按内存利用率排序'D'  - 按磁盘传输速率排序文本模式下关于进程的信息:'g'  - 通用信息(默认)'m'  - 内存详情'd'  - 磁盘详情'n'  - 网络详情's'  - 调度和线程组信息'e'  - GPU 详情'v'  - 各种信息(父进程 ID、用户/组、日期/时间、状态、退出码)'c'  - 每个进程的完整命令行'o'  - 使用自定义的输出行定义按以下顺序排序进程列表:'C'  - CPU 活动'M'  - 内存消耗'D'  - 磁盘活动'N'  - 网络活动'E'  - GPU 活动'A'  - 最活跃的系统资源(自动模式)累积的进程数据:'u'  - 每个用户的总资源消耗'p'  - 每个程序的总资源消耗(即相同进程名)'j'  - 每个容器/Pod 的总资源消耗'U'  - 聚焦于特定用户名(正则表达式)'P'  - 聚焦于特定程序名(正则表达式)'J'  - 聚焦于特定容器/Pod 名'/'  - 聚焦于特定命令行字符串(正则表达式)'I'  - 聚焦于特定进程 ID (PID)'Q'  - 聚焦于特定进程/线程状态系统资源选择(在标题行中显示的按键):'S'  - 聚焦于特定系统资源(正则表达式)屏幕处理:^L   - 重绘屏幕PgDn - 显示进程列表的下一页(或 ^F)PgUp - 显示进程列表的上一页(或 ^B)ArDn - 向下箭头,显示进程列表的下一行ArUp - 向上箭头,显示进程列表的上一行ArRt - 向右箭头,显示完整命令行的下一个字符ArLt - 向左箭头,显示完整命令行的上一个字符展示(在标题行中显示的按键):'a'  - 显示所有进程/线程(而不是活跃的)(切换)'y'  - 显示进程内的线程(线程视图)(切换)'Y'  - 排序线程(与线程视图结合使用时)(切换)'f'  - 显示固定数量的标题行(切换)'F'  - 禁止排序系统资源(切换)'X'  - 在输出中禁止显示已终止的进程(切换)'x'  - 不使用颜色来表示高占用(切换)'1'  - 显示每秒平均值而不是总值(切换)'R'  - 计算比例集大小 (PSIZE)(切换)'W'  - 确定每个线程的 WCHAN(切换)其他命令:'i'  - 更改间隔计时器(0 = 仅手动触发)'t'  - 手动触发以强制下一个采样'r'  - 将计数器重置为启动时的值'z'  - 暂停按钮以冻结当前采样(切换)'l'  - 限制每个 CPU、磁盘和接口资源的行数'k'  - 终止一个进程(即发送信号)'V'  - 版本信息'?'  - 帮助信息'h'  - 帮助信息'q'  - 退出此程序

可以看到,命令还是很强大的。通常使用,我们只需要进入交互模式,之后排序一下进程列表,然后查看进程的详细信息即可。

比如: 如果你想看那个进程占用了最多的 CPU,那么我们只需要进入交互模式,然后按 C (按 CPU 消耗资源排序) 排序,然后按 g (显示通用信息) 查看进程信息,这个时候,你可以按 z 冻结刷新,观察好后按 q 退出即可。

在进入交互模式的时候,你可以直接追加参数,就不用进入交互模式后,再按相关指令排序进程列表或者切换展示视图了:

# 进入交互模式并按使用 CPU 占用率排序
atop -C
# 进入交互模式并按使用内存的占用率排序
atop -M

接下来,我们看几个具体使用的场景。

kill 进程

我们使用 atop 的时候,如果想杀掉某个进程,那么使用 atop 也是可以操作的。先使用 z 冻结刷新,之后你可以选择资源排序(比如: C 就是使用 CPU 占用率排序[默认],按 M 就是使用内存的占用率排序):
atop 冻结刷新

我们只需要按 k (终止一个进程) ,进入选择进程的输入界面:
atop 输入杀死的进程

比如,我们这里 kill 掉 chromium 进程,输入进程的 PID: 619981
输入目标进程

之后,询问发送的信号:

Signal [15]

默认情况,我们直接填 15 就可以了,也就是我们 kill 「pid」 的默认信号。如果无法 kill 可以考虑使用 root 权限运行 atop,或者使用 9

  • SIGKILL (9):强制终止信号。不能被捕获或忽略,进程必须立即终止。
  • SIGTERM (15):终止信号。通常用于请求进程正常终止。

就可以杀掉这个进程了。
进程杀死成功

查看网络流量

首先,网络模块 netatop 并不是 atop 自带的模块。是需要手动安装的,和 atop 不同的是,它使用 动态内核模块支持(DKMS) 来装载到 atop。安装方法,可以看下一个章节的 网络扩展插件 。

在安装好后,我们只需要进入交互模式,然后按 n (网络流量) 排序,就可以看到网络流量了。

不过可能会出现错误 Module 'netatop' or 'netatop-bpf' not active or no root privs; request ignored!:

atop 查看网络流量错误

这个时候,有两种可能:

  • 权限不足: atop 没有权限查看网络流量,这个时候,我们只需要使用 root 权限运行 atop 即可
  • netatop 进程没有启动: atop 会自动关联 netatop 进程,如果 netatop 进程没有启动,那么就会报错。可以使用 systemctl status netatop 查看 netatop 进程是否启动,如果没启动,那么可以使用 systemctl start netatop 启动 netatop 进程

安装 atop

安装好后的 atop 主要包括两个部分:

  • atop 命令: 用于实时查看系统负载状态。
  • atopsystemnctl 服务: 用于定期记录系统活动快照。如果要查看历史数据,atopsystemctl 服务是必不可少的。

至于安装 atop, 方法很多,主要有:

  • 软件包管理器安装: atop 已经在各个软件包管理器内发布,不过版本可能不是最新的。
  • 源码编译安装: 下载 atop 的源码,可以直接安装最新或者指定版本的 atop

安装 atop 命令,都会自动配置 atopsystemctl ;接下来我们都简单介绍一下上述两种安装方法。
好奇

软件包管理器

atop 工具,已经在各个软件包管理器内发布,你只需要使用系统自带的软件包管理器进行安装即可:

# Debian/Ubuntu
apt install atop
# CentOS/RedHat/OpenCloudOS
yum install atop

源码编译

如果你想用高版本的 atop ,那么就需要手动编译,可以在 atop 官方下载界面 找到下载地址,之后下载到本地编译安装,比如我这里使用腾讯云轻量应用服务器操作:

# 下载源代码
wget https://www.atoptool.nl/download/atop-2.11.0.tar.gz
# 解压并进入
tar -xf atop-2.11.0.tar.gz
cd atop-2.11.0

之后,进行编译:

# 编译
make
# 安装
make install
# 查看版本信息
atop -V

手动编译安装

网络扩展插件

默认情况下,atop 没有自带网络监控模块(即可: netaop),需要我们自己安装。同样,首先前往官网,下载最新的 netatop 源码:

# 这里下载 3.2.2 版本的
wget https://www.atoptool.nl/download/netatop-3.2.2.tar.gz
# 解压并进入
tar -xf netatop-3.2.2.tar.gz
cd netatop-3.2.2

之后进行安装:

# 编译
make
# 安装
make install

如果编译过程出现内核头文件找不到,类似于:

./mkversion
make -C /lib/modules/5.10.0-32-amd64/build M=/usr/local/src/netatop-3.2.2 modules
make[1]: *** /lib/modules/5.10.0-32-amd64/build: No such file or directory.  Stop.
make: *** [Makefile:13: netatop.ko] Error 2

这个时候,我们可以使用uname -r查看 Linux 内核版本,并使用软件包管理器安装内核头部文件:

# Debian/Ubuntu 
apt install linux-headers-$(uname -r)
# CentOS/RedHat/OpenCloudOS
yum install kernel-devel-$(uname -r)

内核头文件安装
如果出现

cd /usr/src; dkms add -m netatop -v 3.2.2
Error! Could not find module source directory.
Directory: /usr/src/netatop-3.2.2 does not exist.
make: *** [Makefile:23: install] Error 2

那么是 netatop 的源码需要放在 /usr/src 下的原因。比如:
移动源码并继续编译

这个时候 netatop 就已经安装好了:

# 使用 systemctl 查看 netatop 的运行状态
systemctl status netatop

历史监控日志

上文说到,atop 部署和安装后,会自动配置一个由 systemctl 所管理的守护进程,这个守护进程会自动运行 atop。如果想卸载这个守护进程,可以使用 systemctl stop atop 停止 atop 守护进程,然后使用 systemctl disable atop 禁用 atop 守护进程。

查看这个守护进程的状态,可以使用 systemctl status atop 命令:

查看 atop 守护进程状态
根据上面的输出,我们可以看到,atop 守护进程的配置文件是 /lib/systemd/system/atop.service,我们可以通过 /lib/systemd/system/atop.service 查看这个配置文件的内容:

[Unit]
Description=Atop advanced performance monitor
Documentation=man:atop(1)[Service]
Type=simple
Environment="LOGOPTS="
Environment="LOGINTERVAL=600"
Environment="LOGGENERATIONS=28"
Environment="LOGPATH=/var/log/atop"
EnvironmentFile=/etc/default/atop
ExecStartPre=/bin/sh -c 'test -d "${LOGPATH}" || mkdir -p "${LOGPATH}"'
ExecStartPre=/bin/sh -c 'test -n "$LOGINTERVAL" -a "$LOGINTERVAL" -eq "$LOGINTERVAL"'
ExecStartPre=/bin/sh -c 'test -n "$LOGGENERATIONS" -a "$LOGGENERATIONS" -eq "$LOGGENERATIONS"'
ExecStart=/bin/sh -c 'exec /usr/bin/atop ${LOGOPTS} -w "${LOGPATH}/atop_$(date +%%Y%%m%%d)" ${LOGINTERVAL}'
ExecStartPost=/usr/bin/find "${LOGPATH}" -name "atop_*" -mtime +${LOGGENERATIONS} -exec rm -v {} \;
KillSignal=SIGUSR2[Install]
WantedBy=multi-user.target

解释一下各个参数:

  • LOGOPT: 控制日志文件记录,允许您自定义日志文件的保存路径、命名规则、滚动周期以及其他与日志记录相关的选项。为""表示不使用任何额外选项;
  • LOGINT: 监控周期,单位是秒;
  • LOGGEN: 日志保留时间,单位是天;
  • LOGPATH: 指定atop日志文件的路径。

当然,你也不用修改这个配置文件,只需要修改 /etc/default/atop 文件即可覆写 /lib/systemd/system/atop.service 内的相关配置。

覆写配置文件

使用 vim 覆写或新建 /etc/default/atop 文件,比如,我们想修改 atop 的日志间隔时间,那么只需要修改 LOGINTERVAL 即可,比如:

LOGOPTS=""
LOGINTERVAL=30
LOGGENERATIONS=7
LOGPATH=/var/log/atop

上述的配置,表示 atop 的日志间隔时间是 30 秒,日志保留时间是 7 天,日志文件保存在 /var/log/atop 目录下。

之后,我们只需要重启 atop 守护进程即可生效:

systemctl restart atop

配置 atop 守护进程

那么,atop 守护进程产生的日志文件,如何有效地查看某段时间内的系统负载变化呢?

我们只需要用 atop -r 「日志文件」 命令即可,比如:

# 查看 20241029 日志文件
atop -r /var/log/atop/atop_20241029

查看 atop 守护进程历史日志

这个时候,我们按 t 可以查看下一个时间快照节点,按 shift + t 可以查看上一个时间快照节点。如果你想直接查看某个时间节点,那么可以使用 b,之后出现的提示框:

# 输入时间戳,其中年月日和秒是可选的
Enter new time (format [YYYYMMDD]hhmm[ss]):

查看 atop 守护进程历史日志

是不是很方便呢?还有更方便的,你可以直接用组合键:

# 查看 20241029 日志文件,时间戳为 23 点
atop -r /var/log/atop/atop_20241029 -b 2300

atop 卸载

其实,我个人认为 atop 是没有必要卸载的,因为 atop 的功能非常强大,而且 atop 的守护进程对系统资源的消耗不大(可能只有 10M 左右的内存占用);

如果关闭 atopnetatop 的守护进程 ,那么 atop 甚至没有资源的占用(top 命令的 plus 版本🤔)。

如果还是想卸载 atop ~~

keep going

软件包管理器安装的 atop,那么卸载 atop 就非常简单了,只需要使用 aptyum 卸载即可:

# Debian/Ubuntu
apt purge atop
# CentOS/RHEL
yum remove atop

反编译 atop

如果你是手动编译安装的 atop,那么卸载 atop 就需要手动删除(其实就是把 make install 自动执行的反过来(因为源码包内没有提供 uninstall 的脚本,只能手动反操作了):

# 停止并禁用 atop 服务
systemctl stop atop
systemctl disable atop
# 停止并禁用 atopacct 服务
systemctl stop atopacct
systemctl disable atopacct
# 删除 systemd 服务文件
rm /lib/systemd/system/atop.service
rm /lib/systemd/system/atopgpu.service
rm /lib/systemd/system/atop-rotate.service
rm /lib/systemd/system/atop-rotate.timer
rm /lib/systemd/system/atopacct.service
# 删除 systemd 系统服务的软链接
rm /etc/systemd/system/multi-user.target.wants/atopacct.service
rm /etc/systemd/system/multi-user.target.wants/atop.service
rm /etc/systemd/system/timers.target.wants/atop-rotate.timer
# 删除二进制文件和配置文件
rm /usr/bin/atop
rm /usr/bin/atopsar
rm /usr/sbin/atopacctd
rm /usr/sbin/atopgpud
rm /usr/bin/atopconvert
rm /usr/bin/atopcat
rm /usr/bin/atophide
rm /etc/default/atop
# 删除 man 页面
rm /usr/share/man/man1/atop.1
rm /usr/share/man/man1/atopsar.1
rm /usr/share/man/man1/atopconvert.1
rm /usr/share/man/man1/atopcat.1
rm /usr/share/man/man1/atophide.1
rm /usr/share/man/man5/atoprc.5
rm /usr/share/man/man8/atopacctd.8
rm /usr/share/man/man8/atopgpud.8
# 删除 atop 日志目录
rm -rf /var/log/atop

卸载 netatop

既然 atop 已经卸载,那么也没必要保留 netatop 了,同样根据编译步骤,逆向操作即可:

# 停止并禁用 netatop 服务
systemctl stop netatop
systemctl disable netatop
# dkms 移除 netatop 模块
dkms remove -m netatop -v 3.2.2 --all

卸载 netatop

END

哈哈,我们了解了 atop 的优势,特别是其自动周期性记录和历史数据回放功能。本次的 atop 分享就到这里啦~~ 感谢阅读。也给腾讯云的服务团队点个赞,非常专业和耐心,帮用户解决实际的问题

其实和 atop 类似的工具还有很多(比如: htopglancesnmon 等),主要还是看个人的使用习惯。就好比,查看端口的占用情况,你可以使用 netstatsslsof 等命令,也可以使用 nmapncat 等工具;

如果你有更好的工具推荐,欢迎在评论区留言;有机会,我也给大家出一些其他工具的使用教程。
稳了

最后,如果你对云服务器、CDN、云数据库和Linux等云计算感兴趣,亦或者喜欢编程、设计、产品、运营等领域,欢迎加入我们的开发者爱好群,一起交流学习: 812198734 (目前可能就我一个人?毕竟才刚刚创建 ~)。

相关文章:

洞悉 Linux 系统运行细节,使用 atop 监测和回看系统负载状态

Linux系统的资源使用情况,你可以通过使用命令如free、top和netstat来实时监控内存、CPU及端口的使用状态。对于需要追踪历史资源消耗动态的场景,atop命令则能有效帮助用户查看过去的系统负载情况。 本篇教程的灵感源自一位小伙伴的真实经历:…...

“双十一”电商狂欢进行时,在AI的加持下看网易云信IM、RTC如何助力商家!

作为一年一度的消费盛会,2024年“双十一”购物狂欢节早已拉开帷幕。蹲守直播间、在主播热情介绍中点开链接并加购,也已成为大多数人打开“双11”的重要方式。然而,在这火热的购物氛围背后,主播频频“翻车”、优质主播稀缺、客服响…...

Python调用企业微信的扫一扫

在企业微信里面新建了一个应用,指向了搭建服务器上Django写的web应用。 web应用需要使用扫描二维码的功能,就使用了大家都评价效果好的微信的扫一扫,事实也证明微信的扫一扫很好,但实现这个功能还是花了自己不少时间,很…...

速盾:CDN和OBS能共用流量包吗?

CDN和OBS是两种不同的云服务,它们在内容分发和存储方面有着不同的功能和优势。虽然它们都可以用于提供高效的内容分发和存储服务,但是它们的流量包是不能共用的。 CDN,即内容分发网络,是一种通过将内容存储在全球分布的服务器上&…...

第8章 利用CSS制作导航菜单

8.1 水平顶部导航栏 水平莱单导航栏是网站设计中应用范围最广的导航设计,一般放置在页面的顶部。水平 导航适用性强,几乎所有类型的网站都可以使用,设计难度较低。 如果导航过于普通,无法容纳复杂的信息结构,就需要在…...

C# 集合与泛型

文章目录 前言1.什么是集合&#xff1f;2.非泛型集合&#xff08;了解即可&#xff09;2.1常见的非泛型集合 3.泛型的概念4.常用的泛型集合4.1 List < T > <T> <T>4.2 Dictionary<TKey, TValue>4.3 Queue < T > <T> <T>4.4 S t a c…...

el-date-picker 设置开始时间和结束时间

<el-date-picker v-model"ruleForm.RECORDDATE" type"date" placeholder"日期" format"YYYY/M/D" value-format"YYYY/M/D" style"width: 100%;" :disabled-date"publishDateAfter" > </el-dat…...

【Docker】 常用命令

文章目录 介绍Docker和容器化技术什么是Docker&#xff1f;Docker的优势和应用场景Docker的应用场景包括但不限于&#xff1a; 安装和配置Docker安装Docker引擎配置Docker环境 Docker镜像命令搜索镜像拉取镜像查看本地镜像删除本地镜像 Docker容器命令创建容器启动容器停止容器…...

docker compose - 设置名字

只使用 docker compose up 启动容器&#xff0c;默认名字为当前文件夹的名字 设置 project-name&#xff0c;docker 客户端会显示设置的名字&#xff0c;方便区分 docker compose --project-name webtest up错误&#xff1a; docker compose up --project-name webtest 效果…...

工业拍卖平台、信息发布、租赁商城平台系统适用于全行业解决方案。

工业拍卖平台系统是为工业领域的资产交易、设备处置等提供线上拍卖服务的数字化平台。 主要功能&#xff1a; 拍卖信息发布&#xff1a;平台会展示待拍卖的工业资产详细信息&#xff0c;包括设备的名称、型号、规格、使用年限、生产厂家等基本信息&#xff0c;以及资产的图片…...

一个win32 / WTL下多线程库(CThread类)的使用心得

说是多线程库&#xff0c;其实就是一个单独的.h文件&#xff0c;可以方便的放入WTL/win32工程中。 下载地址&#xff1a;CThread. 里面也简单介绍了 用法。 具体用法&#xff0c;首先自定义一个子线程类继承CThreadImpl<T>&#xff0c;注意他是个模板类。 class CMySu…...

使用wordpress搭建简易的信息查询系统

背景 当前有这样的一个需求&#xff0c;要实现让客户能够自助登录系统查询一些个人的信息&#xff0c;市面上没有特别符合我的需求的产品&#xff0c;经过一段时间的研究&#xff0c;想出了一个用wordpress实现简易信息查询系统&#xff0c;有两种方式。 方式一&#xff1a;使…...

PAT甲级 1076 Forwards on Weibo(30)

文章目录 题目题目翻译深度优先搜索&#xff08;dfs&#xff09;宽度优先搜索&#xff08;bfs&#xff09;总结 原题链接 题目 题目翻译 微博被称为中国的推特。在微博上&#xff0c;一个用户可能有很多粉丝&#xff0c;也可能关注许多其他用户。因此&#xff0c;通过粉丝关系…...

揭开 gRPC、RPC 、TCP和UDP 的通信奥秘

差异点 特性TCPUDPRPCgRPCHTTP工作层级传输层传输层应用层应用层应用层传输协议面向连接的传输协议无连接传输协议使用 TCP、HTTP 等协议HTTP/2HTTP/1.1, HTTP/2序列化格式字节流数据报文XML、JSON 或自定义Protocol BuffersJSON 或 XML特点可靠的连接传输无连接、快速传输远程…...

使用Web Worker来处理多线程操作,以及如何避免主线程卡顿。

在JavaScript中处理大量数据时&#xff0c;由于JavaScript是单线程的&#xff0c;所有的操作都在主线程上运行&#xff0c;因此处理大量数据可能导致页面卡顿和响应迟缓。为了避免这些问题&#xff0c;可以使用Web Workers来实现多线程操作&#xff0c;允许在后台线程中处理复杂…...

杂谈:业务说的场景金融是什么?

引言&#xff1a;市场格局的转变 在供应短缺的年代&#xff0c;是典型的卖方市场。为了保证稳定供货&#xff0c;买方会提前一段时间下单&#xff0c;也几乎没什么议价能力。卖方只需等着接单就行。 现在很多领域的供应商数量越来越多&#xff0c;而且随着互联网的普及&#…...

在vscode实现用和Chrome开发者工具中相同的快捷键进行面板切换

在Chrome开发者工具中&#xff0c;我们可以用 Ctrl [ 和 Ctrl ] 快捷键来切换面板&#xff0c;用起来很方便。 vscode中默认没有这两个快捷键&#xff0c;我们可以通过配置自定义快捷键来实现相同的功能。 配置方法&#xff1a; 1. 按 Ctrl K, Ctrl S 调出快捷键配置面板。…...

【ESP32+MicroPython】硬件控制基础

ESP32是一款功能强大的微控制器&#xff0c;具有多种硬件接口。本文以“ESP32硬件控制”为主题&#xff0c;逐步介绍GPIO&#xff08;通用输入输出&#xff09;、PWM&#xff08;脉宽调制&#xff09;、ADC&#xff08;模数转换&#xff09;等功能的原理与实现&#xff0c;并结…...

Python学习从0到1 day26 第三阶段 Spark ① 数据输入

要学会 剥落旧痂 然后 循此新生 —— 24.11.8 一、Spark是什么 定义&#xff1a; Apache Spark 是用于大规模数据处理的统一分析引擎 简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算TB、PB乃至EB级别的海量数据…...

kafka消费者的消费分区策略有哪些,默认是哪个?

Kafka消费者的分区分配策略主要有以下几种&#xff0c;分别决定了如何将多个分区分配给消费者&#xff1a; 1. Range&#xff08;范围分配&#xff09; 描述&#xff1a;将分区连续地分配给消费者。每个消费者负责一段连续的分区。如果有多个消费者&#xff0c;那么消费者会按…...

SpringBoot离线应用的5种实现方式

在当今高度依赖网络的环境中&#xff0c;离线应用的价值日益凸显。无论是在网络不稳定的区域运行的现场系统&#xff0c;还是需要在断网环境下使用的企业内部应用&#xff0c;具备离线工作能力已成为许多应用的必备特性。 本文将介绍基于SpringBoot实现离线应用的5种不同方式。…...

华为云Flexus+DeepSeek征文|华为云Flexus服务器dify平台通过自然语言转sql并执行实现电商数据分析

目录 前言 1 华为云Flexus服务器部署Dify平台 1.1 华为云Flexus服务器一键部署Dify平台 1.2 设置账号登录Dify&#xff0c;进入平台 2 构建自然语言转SQL并执行的应用 2.1 创建应用并启动工作流设计 2.2 应用框架设计 2.3 自然语言转SQL模块详解 2.4 代码执行模块实现…...

gorm 配置数据库

介绍 GORM 是 Go 语言中最流行的 ORM&#xff08;对象关系映射&#xff09;库之一&#xff0c;基于数据库操作的封装&#xff0c;提供类似 Django ORM / SQLAlchemy 的开发体验。 特性描述支持多种数据库MySQL、PostgreSQL、SQLite、SQL Server、ClickHouse 等自动迁移自动根…...

架构设计技巧——架构设计模板

一份实用、高效、覆盖核心要素的架构设计模板是确保设计质量、促进团队沟通和指导实施的关键。以下是一个经过提炼的架构设计文档核心模板框架&#xff0c;结合了业界最佳实践&#xff0c;并强调灵活裁剪&#xff1a; 架构设计文档模板 (核心框架) 文档标识 项目/系统名称&a…...

spring task定时任务快速入门

spring task它基于注解和配置&#xff0c;可以轻松实现任务的周期性调度、延迟执行或固定频率触发。按照我们约定的时间自动执行某段代码。例如闹钟 使用场景 每月还款提醒&#xff0c;未支付的订单自动过期&#xff0c;收到快递后自动收货&#xff0c;系统自动祝你生日快乐等…...

Redis——主从哨兵配置

目录 基础概念 ‌一、核心原理‌ ‌二、核心特性‌ ‌三、技术意义与应用价值‌ ‌四、典型应用场景‌ 案例部署 ‌一、主从复制配置命令‌ ‌二、哨兵模式部署命令‌ ‌关键注意事项‌ 基础概念 ‌一、核心原理‌ ‌内存存储与高性能‌ Redis 所有数据存储于内存中&…...

2025-06-02-IP 地址规划及案例分析

IP 地址规划及案例分析 参考资料 Plan for IP addressing - Cloud Adoption Frameworkwww.cnblogs.comimage-hosting/articles at master jonsam-ng/image-hosting 概述 在网络通信中&#xff0c;MAC 地址与 IP 地址分别位于 OSI 模型的数据链路层和网络层&#xff0c;二者协…...

Spring Boot 从Socket 到Netty网络编程(下):Netty基本开发与改进【心跳、粘包与拆包、闲置连接】

上一篇&#xff1a;《Spring Boot 从Socket 到Netty网络编程&#xff08;上&#xff09;&#xff1a;SOCKET 基本开发&#xff08;BIO&#xff09;与改进(NIO)》 前言 前文中我们简单介绍了基于Socket的BIO&#xff08;阻塞式&#xff09;与NIO&#xff08;非阻塞式&#xff0…...

视频音频去掉开头结尾 视频去掉前n秒后n秒 电视剧去掉开头歌曲

视频音频去掉开头结尾 视频去掉前n秒后n秒 视频音频去掉开头结尾 视频去掉前n秒后n秒 电视剧去掉开头歌曲 如果你有一些视频或者音频&#xff0c;你想去掉开头或结尾的几秒钟&#xff0c;那么你可以尝试一下这个工具&#xff0c;首先&#xff0c;我们来看一下&#xff0c;我们以…...

【联网玩具】EN 18031欧盟网络安全认证

在当今数字化时代&#xff0c;带联网功能的玩具越来越受到孩子们的喜爱&#xff0c;它们为儿童带来了前所未有的互动体验和学习机会。然而&#xff0c;随着这类玩具的普及&#xff0c;网络安全问题也日益凸显。为了保障儿童使用这类玩具时的安全与隐私&#xff0c;欧盟出台了 E…...