Skip to content
On this page

监控篇 - 服务性能监控


前言

这一篇也是比较独立,因为在常规前端中,我们发布出去的内容都是以静态资源的形式存在,如果是走 Nginx,天然的高并发服务器并不需要我们去做太多的事情,而丢到 oss 这种文件存贮之后,也不用再关心性能的问题,最多在挂个 cdn 即可,这种事情在大部分的小公司可能还需要自己来做,但是在稍具规模的大公司,一般也会有运维来操作。

如果是使用 nodejs 的话,一般也会走 docker + 云服务器,云服务器一般自带就有服务器的监控,所以这篇的内容针对于两个方面,一个是内部的服务器,会上一些小型的 node 服务,这种服务启动速度比较快,也不需要使用 Rancher 这种集群服务。另一个是打包机上的一些监控,例如缓存超过磁盘使用率预警之类的。

普通的 node 服务

pm2-web

如果是一些小型的 node 项目,例如 express 或者 koa 就能解决的问题,在发布的时候,想必大部分的同学都是使用过 pm2 这个工具。但是不知道有没有同学使用过 pm2-web 这个针对于 pm2 服务状态的监控程序。

安装跟运行都非常简单,运行下述两个命令即可。

shell
npm install -g pm2-web
shell
pm2-web #运行(默认占用8080端口)

运行完毕之后,会出现如下的界面,会收集当前一起动的 pm2 的服务信息,也可以对搜集的 pm2 的服务做 stop、restart、reload 等操作。这样的话,可以不用去服务器看这些内容。

image.png

同时,可以再 web 端能看到当前服务所使用的 CPU、内存以及日志,默认五天内的 cpu 以及内存数据都能获得,能很好地监控到整个 node 服务的一些情况,不过也不需要调整太多,监控服务本身就是在消耗一定的资源换取内容。

虽然很好用,不过还是比较老旧的项目了,已经不维护了。我们的服务使用的是 Egg,所以接下来推荐另外一个。

Easy-Monitor

全新的企业级 Node.js 应用性能监控与线上故障定位解决方案,整个监控项目是基于 Egg来写的,是个人(阿里大佬,人很热心)维护,之前我们公司也在使用,整个的文档写的非常详细,点击查看

image.png

在装完本身的监控系统之后,它并不能跟 pm2-web 一样自动收集,需要主动在项目代码中注入,类似于 sentry。 一样,生成 key 跟 token 在自己的系统中配置。对于 Egg 项目提供了方便的插件使用,其他的 node 项目也能接入不过稍微麻烦点。

之所以推荐,是因为他自带了一个告警内容,这一块的话,可以自定义配置,如果触碰到了告警规则,可以主动发送消息,有钉钉以及自定义的 webhook 推送。

整个监控的架构设计如下,想了解更多的同学,建议上手尝试一波。

image.png

Sentry

第三个还是 Sentry,在合理的使用下,还是可以帮我们解决不少的问题,比如我们在 node 项目中,关键的接口或者业务逻辑中,采用自定义上报的模式,如果出现问题,可以及时的通知到我们。

打包机

在打包机上,我们关注的更多的是服整个服务器的内存、cpu 等等的内容。所以首先我们要熟悉一些 linux 的常用命令。

例如在内存快满的时候使用 sudo rm \-rf/* 这样的命令可以快速释放存储空间。

上面那句话别信,也不要尝试,这是删除服务器所有内容,用完你这份工作也差不多到头了。

top - 经典的 Linux 任务管理工具

使用格式:

top [-] [d] [p] [q] [c] [C] [S] [s] [n]

参数说明:

  • d:指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
  • p: 通过指定监控进程 ID 来仅仅监控某个进程的状态。
  • q: 该选项将使 top 没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
  • S:指定累计模式。
  • s:使 top 命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
  • i:使 top 不显示任何闲置或者僵死进程。
  • c: 显示整个命令行而不只是显示命令名。

运行完毕之后可以看到如下的监控内容:

image.png

类似于 windows 或者 mac 的活动监视器,可以看到哪些服务异常。

其他的一些监控大都也都是服务器命令,大同小异,并没有找到非常合适的,如果有同学有更好的推荐,可以跟我说下,我也缺。

内存命令

磁盘大小命令 df

执行 df \-hl 如下图所示,可以得到挂载磁盘的一些具体情况。

image.png

下述是命令参数:

  • -a或--all:包含全部的文件系统;
  • --block-size=<区块大小>:以指定的区块大小来显示区块数目;
  • -h或--human-readable:以可读性较高的方式来显示信息;
  • -H或--si:与-h参数相同,但在计算时是以1000 Bytes为换算单位而非1024 Bytes;
  • -i或--inodes:显示inode的信息;
  • -k或--kilobytes:指定区块大小为1024字节;
  • -l或--local:仅显示本地端的文件系统;
  • -m或--megabytes:指定区块大小为1048576字节;
  • --no-sync:在取得磁盘使用信息前,不要执行sync指令,此为预设值;
  • -P或--portability:使用POSIX的输出格式;
  • --sync:在取得磁盘使用信息前,先执行sync指令;
  • -t<文件系统类型>或--type=<文件系统类型>:仅显示指定文件系统类型的磁盘信息;
  • -T或--print-type:显示文件系统的类型;
  • -x<文件系统类型>或--exclude-type=<文件系统类型>:不要显示指定文件系统类型的磁盘信息;
  • --help:显示帮助;
  • --version:显示版本信息。

文件大小命令 du

执行 du \-sh如下图所示,我们可以得到当前目录的总大小

image.png

下述是命令参数

  • -a 或-all 显示目录中个别文件的大小。
  • -b 或-bytes 显示目录或文件大小时,以byte为单位。
  • -c 或--total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。
  • -k 或--kilobytes 以KB(1024bytes)为单位输出。
  • -m 或--megabytes 以MB为单位输出。
  • -s 或--summarize 仅显示总计,只列出最后加总的值。
  • -h 或--human-readable 以K,M,G为单位,提高信息的可读性。
  • -x 或--one-file-xystem 以一开始处理时的文件系统为准,若遇上其它不同的文件系统目录则略过。
  • -L<符号链接>或--dereference<符号链接> 显示选项中所指定符号链接的源文件大小。
  • -S 或--separate-dirs 显示个别目录的大小时,并不含其子目录的大小。
  • -X<文件>或--exclude-from=<文件> 在<文件>指定目录或文件。
  • --exclude=<目录或文件> 略过指定的目录或文件。
  • -D 或--dereference-args 显示指定符号链接的源文件大小。
  • -H 或--si 与-h参数相同,但是K,M,G是以1000为换算单位。
  • -l 或--count-links 重复计算硬件链接的文件。

参考文章

top 命令

内存 命令

本章小结

在本章,我们介绍了一些监控 node 服务的一些工具以及熟悉了 linux 的一些常用命令,虽然本章的内容对一些稍具规模具有运维的团队来说,不算实用,但是技多不压身,有些问题可以自己快速定位解决效率总是最高的。

如果你有什么疑问,欢迎在评论区提出,或者加群沟通。 👏