Linux 图形化监控工具
最近在分析线上问题,需要监控 Linux 相关指标,如果只是用命令,总是只能知道当前的值,无法记录过程。而设备不是云厂商的设备,所以没有相关监控,zabbix 有,但是没有相关权限可以看到。所以找到一些好用的监控小方案。
nmon安装yum install nmon
使用
总结
安装方便,使用简单,最快速度能搞定,无需过多依赖,控制台展示
当然它还有其他内存等相关信息的展示
不是特别好看(毕竟是控制台要求也不能太高),精度相对低,只能有个大概峰值
bottom安装因为是 rust 搞的,所以可能有相关依赖,需要手动处理
12345678910111213141516wget https://github.com/ClementTsang/bottom/releases/download/0.4.5/bottom_x86_64-unknown-linux-gnu.tar.gztar xvf bottom_x86_64-unknown-linux-gnu.tar.gz./btm# 如果出现以下错误需要安装 glibc # /btm: /lib64/libc.so.6: version ...
你的网络还好吗
之前说了 CPU、内存 、IO 在排查过程中可能出现的问题以及出现问题会影响的指标,这次就来看看在 linux 中网络的问题。
在实际中我们遇到的最多的网络问题就是:不通!!!无论是 ping 不通,物理链路不通,还是 dns 解析有问题导致的不通,还是容器间网络访问网络隔离造成的不通,等等,这个问题总是由于部署上的环境导致的。还有一类比较烦的问题就是网络带宽本来就不高的情况下,大量的请求导致网络的拥塞,最明显的感受就是接口请求超时,各种超时,nginx 超时,请求本身超时等等。对于这些问题如何进行排查呢?
诊断指标sar命令sar -n DEV 1
12345678910[root@Linkin ~]# sar -n DEV 1Linux 3.10.0-1062.9.1.el7.x86_64 (Linkin) 07/04/2020 _x86_64_ (2 CPU)03:03:40 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s03:03:41 PM br-22d ...
你的 IO 还好吗
在 CPU 看来内存好慢啊,看我跑的多快;在内存看来磁盘你好慢啊,看我比你还快点;磁盘…
IO 问题并非特别常见,但是因为最终要落到磁盘上,当它成为瓶颈时,往往会拖慢你的脚本,今天我们来分析下在 linux 中的 IO 问题
指标看 IO 并不只是看 IO,记住这句话,因为很多时候,IO 问题总会伴随着别的问题一起出现,而会导致误判的,从而遗漏了问题的关键。
IO 问题的指标来源于两块:
文件系统
磁盘
iowait命令top
iostat
%iowait 表示在一个采样周期内有百分之几的时间属于以下情况:CPU空闲、并且有仍未完成的I/O请求。
指标iowait 升高或者居高不下,可以考虑存在 IO 瓶颈或压力
rs / ws命令iostat -x -d 1
123Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilvda 0.00 13.00 0. ...
快速上手 dubbo-go
每次技术调研总会发现自己学不动了怎么办?用已有的知识来拓展要学习的新知识就好了~ by LinkinStar最近需要调研使用 dubbo,之前完全是 0 基础,对于 dubbo 只存在于听说,今天上手实战一把,告诉你如何快速用 go 上手 dubboPS:以下的学习方式适用于很多新技术
基本概念首先学习一个技术首先要看看它的整体架构和基本概念,每个技术都有着自己的名词解释和实现方式,如果文档齐全就简单很多。
http://dubbo.apache.org/zh-cn/docs/user/preface/background.html
大致浏览了背景、需求、架构之后基本上有一个大致概念
其实整体架构和很多微服务的架构都是类似的,就是有一个注册中心管理所有的服务列表,服务提供方先向注册中心注册,而消费方向注册中心请求服务列表,通过服务列表调用最终的服务。总的来说 dubbo 将整个过程封装在了里面,而作为使用者的我们来说更加关心业务实现,它帮我们做好了治理的工作。
然后我抓住了几个我想要知道的重点:
注册中心可替换,官方推荐的是 zk
如果有变更,注册中心将基于长连接推送变更数据 ...
你的内存还好吗
内存问题往往是线上环境最容易导致的问题,因为其实对于程序来说,内存总是不够用的。而大多数我们在线上遇到的问题总是一个叫 OOM 的,导致这个问题的原因也有很多,今天我们就来看看,如何在线上定位或者排查这样的问题。
诊断指标free命令free -h
1234[root@Linkin /]# free -htotal used free shared buff/cache availableMem: 7.6G 326M 6.2G 480K 1.1G 7.0GSwap: 0B 0B 0B
指标这个命令可以看到当前设备的内存总体使用情况,以及很清楚的看到交换区的内存使用情况
total:总内存
used: 已使用内存,包含共享内存
free: 未使用内存
shared: 共享内存
buff/cache 缓存和缓冲区
available 新进程可用内存
top命令top + M
指标12345678 ...
Golang 监控全局变量
你是否曾经遇到过这样的情况,在开发环境排查问题,因为一些数据保存在了一些全局变量中,这些变量往往是一个 map 或者是一个数组,想看看在运行过程中,这里面究竟存放了什么数据,有时不得不在运行的时候将它输出到日志中,那么如果我想实时看到这些数据的情况又怎么办呢?
其实 golang 中已经存在这样的库,就是来做这个事情的 expvar
使用案例废话不多数,直接上案例
123456789101112131415161718192021222324252627282930313233343536373839package mainimport ( "expvar" "net/http")var ( s map[string]string user User)type User struct { Name string `json:"name"` Age int `json:"age"`}func showMap() interface{} { re ...
你的 CPU 还好吗
最近经常在线上排查一些问题,在大多数情况下,都是代码写的业务逻辑有问题;还有一些情况是内存上导致的问题,如 OOM 或者由于数据量大导致的一些问题;但是很少会关注,但常常又会瞟一眼的,这个关注点就是 CPU。
在说到 CPU 的时候往往除了 top 看一下 CPU 使用率之外,你还会关注别的什么吗?好像也不会。
但是其实当真正出现问题的时候,很多 CPU 相关的指标都会反映出一些问题,经过之前的学习今天就来总结记录一下。
诊断指标平均负载定义系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数(单位时间内活跃进程数)
查看
uptime
top
指标当平均负载高于 CPU 数量的 70% 可能就有问题了(在实际中如果你看到平均负载突然升高,也就是三个值呈现递减的趋势,就需要考虑 CPU 问题了)
CPU 使用率定义除了空闲时间外的其他时间占总 CPU 时间的百分比
查看
top
ps
mpstat -P ALL 5
pidstat
指标这个其实不用说你就有感觉的,如果你看到你的程序占用了 30%CPU 使用率,而别人都没得用,那就肯定奇怪了
上下文切换定义将前一 ...
python 基础语法笔记
记录python的一些基础语法,用于查阅
列表和元组
列表和元组都是有序的,可以存储任意数据类型的集合
列表是动态的,长度可变,存储空间和性能略逊与元组
元组是静态的,长度大小固定,不能增加修改
创建一个列表使用 empty_list = [] 相比于 list() 更好,因为 [] 底层走的c,而 list() 是函数,更加贵
1234567891011121314151617181920l = [1, 2, 3, 4]tup = (1, 2, 3, 4)list((1, 2, 3))[1, 2, 3]l.count(3)l.index(7)l.reverse()l.sort()l.append(4)# extend会将里面的元素添加进去,而append会直接将[1,2]作为一个元素加入l.extend([1,2])tuple([1, 2, 3])(1, 2, 3)tup.count(3)tup.index(7)list(reversed(tup))sorted(tup)
字典和集合本质就是hash表
删除会赋值为特殊值并在rehash调整大小的时候进行处理
会保留1/3的大小 ...
Golang用300行代码实现内网穿透
我们经常会遇到一个问题,如何将本机的服务暴露到公网上,让别人也可以访问。我们知道,在家上网的时候我们有一个 IP 地址,但是这个 IP 地址并不是一个公网的 IP 地址,别人无法通过一个 IP 地址访问到你的服务,所以在例如:微信接口调试、三方对接的时候,你必须将你的服务部署到一个公网的系统中去,这样太累了。
这个时候,内网穿透就出现了,它的作用就是即使你在家的服务,也能被其人访问到。
今天让我们来用一个最简单的案例学习一下如何用 go 来做一个最简单的内网穿透工具。
整体结构首先我们用几张图来说明一下我们是如何实现的,说清楚之后再来用代码实现一下。
当前网络情况
我们可以看到,画实线的是我们当前可以访问的,画虚线的是我们当前无法进行直接访问的。
我们现在有的路是:
用户主动访问公网服务器是可以的
内网主动访问公网服务也是可以的
当前我们要做的是想办法能让用户访问到内网服务,所以如果能做到公网服务访问到内网服务,那么用户就能间接访问到内网服务了。
想是这么想的,但是实际怎么做呢?用户访问不到内网服务,那我公网服务器同样访问不到吧。所以我们就需要利用现有的链路来完成这件事。
基 ...
将版本信息打包到go的二进制中
很多时候对于go打包后的二进制文件,我们是无法知道这个二进制是什么当前什么版本、什么时候打包的,而很多软件的命令行都会有一个 -version 的选项来打印出当前程序的版本号,当然你可以直接在程序里面写死这个版本号,但是还有更加优雅的解决方式。
实现其实很简单,只需要在 build 的时候通过 -X 参数去指定变量值就可以了
1234567891011121314package mainimport "fmt"var ( Tag = "v0.0.0" CommitID = "" Branch = "" DATE = "")func main() { fmt.Println("tag:", Tag, "branch:", Branch, "commitID:", CommitID, "DATE:", DATE)}
12345678910111213 ...
回首网络知识之 TCP 协议
之前我们说了 UDP 协议,也说到了 UDP 协议和 TCP 协议的对比,知道了 TCP 协议有那么一些复杂,所以这次就来仔细说说这个复杂的 TCP
前言提到 TCP 你第一想到的应该就是两个字 “靠谱”~ 因为它的所有设计都是围绕着这个任务展开的。
报文格式
很多人一看到这个就头疼了,因为格式好复杂啊,和 UDP 对比起来,怎么多了那么多东西呢?
别急,其实并不是很多,而且只要你想着为什么,你就知道会有什么。
首先是两个端口,这个和 UDP 一样,肯定需要端口,不然的话不知道是发给谁的
然后是序号和确认序号,序号是为了解决乱序的问题,如果没有序号,那么我是不知道那个先那个后,同时我还要告诉对方我收到了这个序号的信息,所以需要一个确认序号,确认的方式是告诉你我要的下一个序号是多少
首部长度也很好理解,告诉你首部有多长,你就知道前面有多长,你才知道数据从哪里开始
中间那几个标识位需要知道的是:
SYN:建立连接时用的,建立连接会标识为 1
ACK:回复你建立连接,建立连接之后标识为 1
RST:重新连接
FIN:结束连接
窗口大小,接收方告诉发送方别发太快了或者太慢了,用于流 ...
Golang 之 WaitGroup 源码解析
如果我们有一个大的任务要做,我们会尝试将这个任务分解,分解完成之后并发交由 goroutine 去做,并且我需要当全部的任务完成之后再进行下面的步骤,在 sync 包下,就有这样一个东西适合上述情况,WaitGroup,今天我们来看看具体它是怎么实现的。
PS:在下面我统一用 wg 来简称 WaitGroup
使用它的使用非常简单,如下:
12345678910111213func main () { wg := sync.WaitGroup {} for i := 0; i < 10; i++ { wg.Add (1) go func (job int) { defer wg.Done () //do something fmt.Printf ("job % d done\n", job) }(i) } wg.Wait () fmt.Println ( ...
回首网络知识之 UDP 协议
最近开始在恶补网络知识,算是一个复习,在学习了很多上层建筑之后回来看看之前的基础确实又有一个新的认识。一开始准备看完之后做一个整体的总结,但是发现知识点太多所以分了几期来写,每期都会短一点,这期我们先来简单了解一下 UDP
前言传输层中重要的两个协议 UDP 和 TCP ,在平时的时候,你虽然一直用着他们,但是往往感受不到他们的存在,他们两个往往经常会在面试的时候出现,打你一个措手不及。
在学习它之前,你首先要有一个概念,为什么我们需要 UDP 或者 TCP 这样的协议,它到底是在什么时候,什么地方,帮我们完成了什么样的事情?
在网络,我们研究的往往都是如何以一种合理的方式传递数据
而且协议则指定了这样的规定,当双方都遵守这样的规定,才能看懂互相说的话,才能达到合理传递数据的目的。
UDP 怎么样
UDP 格式简单,没有花里胡哨的东西
UDP 不会先探路,而是直接就发上了
UDP 不会管你卡不卡,发给你我就不管了
报文格式
源端口号(16 位,2 字节)
目的端口(16 位,2 字节)
UDP 长度(16 位,2 字节)
UDP 校验和(16 位,2 字节)
...
实现分布式锁,你能想到什么?
所谓分布式锁,即在多个相同服务水平扩展时,对于同一资源,能稳定保证有且只有一个服务获得该资源 — by LinkinStar
其实对于分布式锁,也是属于那种看似简单,实则有很多细节的问题。很多人在被问到这个问题的时候,一上来就会说用redis嘛,setnx嘛,我知道我知道。但仅仅是这样就能搞定了吗?那么当我们在实现一个分布式锁的时候,我们究竟需要考虑些什么呢?
必考点首先作为一个分布式锁,你一定要保证的是什么呢?
不能有两个服务同时获取到一把锁(资源)
不能出现有一个资源一直被锁住(锁一直被持有)
我认为上面两点是必须要保证的,其他的点,比如锁的获取是否高效,锁获取的非阻塞等等是评价一个锁是否好用的点(当然也不是说不重要)
下面我们一个个实现方案来说,来看看究竟有多少细节是我们需要考虑的。
redis实现先从最普遍的实现方案开始说起,redis。利用redis的特性,nx,资源不存在时才能够成功执行 set 操作,同时设置过期时间用于防止死锁
加锁SET resource_key random_value NX PX lock-time
解锁DEL resource_key
面 ...
细说kubernetes - 初识deployment
当我们认识的k8s的时候,我们第一个认识的是pod,那么我觉得第二个认识的应该就是Deployment了。作为k8s中一个非常常见的对象,今天我们来看看它的实现原理和设计思想。
PS: 本文需要你对pod的定义和理解有一定的基础
定义在k8s中,对象常常都是以一个yaml格式的文件来定义的,deployment也不例外。如果你对k8s还不是特别了解,你大可以将一个文件看做是一个对象的所有属性,每个属性都有对应的值,其实也并不复杂。deployment的定义如下:
1234567891011121314151617181920212223242526# 定义版本apiVersion: apps/v1# 定义类型kind: Deployment# 定义名称和标签metadata: name: nginx-deployment labels: app: nginx# 定义规格spec: replicas: 2 selector: matchLabels: app: nginx # 定义模板 template: metadata: label ...
细说kubernetes - 为什么是pod
k8s作为现在最火的容器编排调度平台,好用我也就不必多说了。当我们初识k8s的时候一个新的概念就到了我们眼前,那就是pod。我们在使用了之后也就渐渐的接受了pod这个东西,但是你有没有想过,为什么是pod?k8s为什么会有这样的设计?今天我们就来细细说说这个pod
架构图首先我们来回忆看看k8s的架构图是什么样子的这个是来源于 https://www.kubernetes.org.cn/ 中文官网的一个架构图
从架构图中我们可以看到,整个k8s的设计架构有以下几个要点:
master、node架构;master就是大脑充当着管理者的角色
master中提供了api-server、controller-manager、scheduler、etcd用于管理node并向外提供服务
node就是实际干活的,提供了kubelet、proxy用于向master汇报情况,并管理pod的网络
而pod是k8s中最小的调度单位,Pod就是最小的,管理,创建,计划的最小单元.
当然其他组件都非常重要,这个我们以后再说,我们今天就来看看主角“pod”
为什么是pod?一开始用的时候我就好奇为什么k8s ...
细说docker - 容器技术
docker对于现在的我们来说,已经是一个非常熟悉的东西了,docker无论是在部署打包,自动化,等方方面面都起着重要的作用,但是你是否有疑问,docker究竟是如何帮我们创建一个个隔离的环境的呢?今天我们就来看看,仔细说说docker
PS: 以下的讨论都限定在linux环境下,在windows和macos下容器技术实现不相同,不在讨论范围内。
大方向为什么先要提到这个词呢?因为所有在操作系统上运行的程序都叫做进程。docker也不例外,从大的方向来讲,docker就是帮你创建了一个进程而已。而不一样的是,docker通过限制了各种环境,就像给这个进程画了一个圈,所以在这个进程本身看来,它自己好像被隔离了一般。
docker容器技术的核心,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”
限制条件那么我们有了大方向,那么来细细看看,首先的第一个问题就来了,docker是通过什么方法对这个进程进行限制的呢?
Namespace命名空间,没错就是它,是它限制了docker容器的环境。其实这是linux的一个功能而已,只不过没人想到docker会那它来做这个事情。下面看个 ...
再看golang垃圾回收
首先要说一些废话:之前我已经有博客写过golang的垃圾回收相关的内容,虽然很简略,但是涵盖了整体的流程,现在为啥又来写一遍呢?一方面有一些政治(你懂得)因素在里面,一方面最近又再研究。那么问题来了,那么多博客已经写过了它,我怎么把它讲出花来呢?我思前想后,于是想出了几个独特的角度来重新诠释一下golang的垃圾回收。
那首先如果再把整个gc过程简单说一遍,可能就没有人愿意听了,但是golang的gc说简单也简单说复杂其实也有很多细节,如何做到有自己的想法呢?于是我就强行举例了几个问题。
问题&角度在研究golang垃圾回收的时候,你有没有想过下面几个问题
golang如果有两个对象循环互相引用,是否会出现永远回收不了的对象?
golang的gc标记方式为什么用bfs而不是dfs?
是否有可能永远不触发gc?
为什么golang的gc不整理、不分代?
个人理解首先说明一下,这些问题都是我自己想的,也没有什么所谓的正确答案,所以下面也是我的个人理解,如果有问题可以在下方留言进行讨论。
问题1
golang如果有两个对象循环互相引用,是否会出现永远回收不了的对象?
为什么会 ...
快速上手kubernetes——minikube最小实现
最近在研究k8s,就来写一个关于k8s快速上手,并记录采坑的点。需要的前置知识点:docker、k8s的一些基本概念,下面这个可能对你有帮助。https://juejin.im/post/5d1b2a656fb9a07edc0b7058
什么是k8s我们知道,我们可以将项目制作成docker镜像,然后利用docker去部署我们的项目,这样可以解决很多服务器环境所带来的问题;但是容器多了,容器与容器之间就需要访问,之间就需要网络配置等等,从而就有了docker-compose;但是当我们的服务进行升级,或者服务需要进行调度,扩容等等,这个时候就需要一个大管家来管所有的东西;这个大管家就是 - Kubernetes
初学会遇到的问题因为k8s的东西太多了,所以学习成本现在越来越高,好在k8s已经很多教程。我说一下现在学的时候肯定会遇到的大问题:
国内的问题(国内环境很多镜像拉不到)
本地搭建环境(原来搭建k8s需要一些服务器)
电脑环境的问题(windows和mac都有坑点)
最小实现现在我们就来在本机实现一个最小的k8s的实现,给出一个hello-worldk8s提供了miniku ...
快速上手terraform —— 阿里云OSS和ECS的创建
最近在研究terraform,采了一圈坑,记录一下。
什么是terraform?terraform 通过代码配置实现物理机等一些资源的分配。简单说就是,写一个配置文件,启动,就能帮你购买一台云的机器,或者说申请到oss的资源,或者是别的什么。具体功能见官网。
https://www.terraform.io/docs/index.html
名词解释:provider你可以把它看做各个厂商对terraform提供的插件,terraform可以调用这些插件从而实现对资源的操作管理。terraform流程:init -> plan -> apply -> destroy对应为:初始化,计划验证,实际应用,销毁
最小demo我将用一个最小的demo来演示它怎么干活的:通过terraform来创建一个阿里云的oss(以下没有利益相关)只是因为阿里云我有账号而已,其他供应商也有。
我的本地环境:macOS
步骤1 下载相关资源下载对应的客户端:https://www.terraform.io/downloads.html下载解压后得到:terraform的客户端,将它复制到 /u ...