自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

班门弄斧

欠的技术债,总是要还的。

  • 博客(86)
  • 收藏
  • 关注

原创 如何查看进程占用的内存

方法一top -P pid,其中RSS为进程当前使用的内存top - 22:18:50 up 163 days, 5:48, 64 users, load average: 0.88, 1.07, 1.45Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie%Cpu(s): 1.5 us, 0.9 sy, 0.0 ni, 97.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.3 st

2022-05-29 22:22:45 8548 1

原创 kubernetes cluster autoscale 不会删除nodes

项目上线后,通过kubectl top node,发现有的node上使用的资源非常少,kubectl describe node 发现完全可以驱逐。但是cluster aotuscaler缺没有驱逐。按照官方的说法检查了node上的pod,没发现有什么pod满足以上。gitlab runner原来装在kube-system namespace下,最后把node上的gitlab runner删除,node即可被驱逐,猜测gitlab runner可能满足了以下导致。...

2022-04-16 14:39:34 454

原创 perf对多线程Profile简单流程

背景知识Perf是用于软件性能分析的工具,通过Perf,应用程序可以利用PMU,tracepoint和内核中的特殊计数器进行性能统计。Perf不但可以分析应用程序的性能问题(per thread),也可以分析内核的性能问题,处理所有性能相关的事件:程序运行期间的硬件事件,如instructions retired ,processor clock cycles等;软件事件,如Page Fault和进程切换。Perf基本原理是对被监测对象进行采样,最简单的情形是根据tick中断进行采样,即在tick中断内

2022-02-13 20:48:52 3269

原创 redis cluster使用lua脚本的坑,非同一个slot也可以使用lua脚本

在项目中,需要用lua脚本操作redis cluster中的多个key,但是非同slot的时候会报错,例如下面test3、test6在同一个node,但是却不是同一个slot。redis使用lua脚本可以这样`redis-cli -a xxxxx--eval demo.lua key1 key2 , val1 val2`

2022-02-10 21:09:51 4155 1

原创 redis cluster 查看各个节点的slot

`redis-cli -p xxxx -c cluster nodes`

2022-02-10 20:38:56 1833

原创 如何在linux中通过linux源码安装最新的perf,使用perf data convert --force --to-json

perf可以针对进程进行profile,也可以对线程进行profile。再对进程profile之后,拿到perf.data,也可以修改为针对进程下的线程进行profile。所以照理来说应该是可以从perf.data中查看到有多少线程。这也符合我们的一般要求,即有perf.data之后,可以针对线程显示火焰图。经过查询资料发现,perf中有perf data convert --force --to-json temp.json可以把perf.data转成json进行查看,但是要新版本的perf才有…这就恨

2022-02-10 20:25:42 1445

原创 iptable为什么之后pod的probability越来越大

项目集群是使用k8s管理的,流量分发使用的是iptable,据压测反馈说负载不均衡,吓得老夫赶紧去查看,发现原来是压测同学搞错了。在查询的过程中,发现iptable规则之后的probability越来越大,记录一下原因。root@ip-10-1-34-89:/home/admin# iptables -t nat -nL...Chain KUBE-SVC-7XZINH2IMK6FHKPK (2 references)target prot opt source d

2022-02-10 20:03:47 771

原创 redis 怎么查询一个key有多大

在项目开发过程中,最好是能估计出自己开发的功能要使用多大的redis内存使用redis自带的方法debug object key127.0.0.1:6006> get testkey"this is a test"127.0.0.1:6006> debug object testkeyValue at:0x7f4f19e2b500 refcount:1 encoding:embstr serializedlength:15 lru:14327341 lru_seconds_idle:

2022-01-09 17:06:27 8181

原创 linux top显示CPU占用高,Steal高

top显示cpu高,steal高

2021-12-26 21:50:18 1550

原创 docker 启动 redis cluster,使用出现CLUSTERDOWN Hash slot not served(redis cluster重新分配slot)

背景就像上一篇所说,我使用了docker-componse启动了redis cluster集群。经过了一天的测试,本来测试已经完毕了,但是今天修改了点代码,再次测试的时候发现redis cluster起不来了。报错CLUSTERDOWN Hash slot not served。从这个错误提示,可以看出是slot分配原因造成的。上网找,真的蛋疼,你复制我,我复制你,最后还是得自己解决。查看详细banfushen@banfushen:~/redis-cluster$ redis-cli -p 16379

2021-12-07 22:24:21 3804

原创 linux使用docker + docker compose 本地搭建redis cluster集群

背景项目用到一个redis库,对于里面的集群相关功能要自己测试(就像《代码简洁之道》中说的,使用第三方库需要自己有测试用例,这样即使第三方库更新了,直接用原来的测试用例,也知道是否能兼容)。所以需要自己本地搭建redis集群测试。搭建是使用docker搭建的,一下需要启动很多个container,所以使用docker-compose作为容器编排我的环境已经有了,没有的自己下载直接上redis-cluster模式redis集群有三种模式:master+slave(主从)、sentinel(哨兵)、cl

2021-12-05 23:19:04 1918

原创 linux 磁盘IO满导致的宿主机卡机,pod失败(/kubepods/besteffort/pod4909103c-cdc)

背景开发机上装了minikube,起了一个docker镜像当minikube的宿主机,在启动了一定量的deployment A之后,deployment A就全挂了(启动1~2个deployment A,没有问题,启动到第三个,就全挂)。然后宿主机卡爆。查询pod挂的原因kubectl describe pod ... Exit Code: 137 Started: Wed, 29 Sep 2021 16:02:30 +0800 Finished:

2021-09-29 19:35:42 20201

原创 第一次服务器上限需要资源评估

本是小辣鸡。以前也只是写业务代码,全靠领导给机会让我自己负责一个服务器的编写,部署,上线需要的资源评估。记录第一次做上线资源评估的过程。项目背景是,搭在云服务商上的集群,集群管理是kubernetes。首次内测目标5000个用户。主要如下1.服务器需要多少内存2.服务器需要多少cpu3.了解购买的云服务参数4.修改kubernetes部署文件首先需要做压测,我写的服务器是用golang写的用于聊天服务器,所以在世界聊天的时候,压力就会非常大。压力也是要测试这里,看看需要消耗多少性能。服务器需

2021-08-05 21:53:08 1026

原创 Kubernetes nodes are not ready原因查看

今早收到了Prometheus的报警,4% of Kubernetes nodes are not ready。直接查看node情况即可知道原因。banfushen@pro:~/helm-chart/prometheus-netease/templates$ kubectl describe nodes ip-xx-x-xxx-xxx.ap-northeast-1.compute.internalName: ip-xx-x-xxx-xxx.ap-northeast-1.co

2021-07-24 18:02:50 628

原创 redis集群数据倾斜查询过程

项目上redis cluster数据产生了倾斜,项目是有3个节点,但第一个节点用了80%的内存,第二第三个节点基本没存数据。redis cluster存贮规律redis 集群有16384个槽,会先对要存贮的key进行hash,将得到的结果放到对应的槽。一般会对整个key进行hash,如果key中含有{},会对{}中的字符串进行哈希。先查看集群中是否是因为key的原因造成倾斜redis-cli -h xxx.xxx.xxx.xxx -p xxx -ckeys *{*}*查看之后发现,并不是因为{

2021-07-23 18:08:05 440 1

原创 golang非阻塞读写channel

服务器最近压测的时候发现了问题。发现是往channel写数据,但是channel满了,导致服务器部分功能阻塞。golang的channel读或写是会造成阻塞的,但是可以用select的多路复用解决这个问题。不阻塞读channel(也可以加上超时)func readChan(c chan int) (int, error) { select { case num := <-c: return num, nil default: return 0, errors.New("chan do

2021-07-23 14:27:08 3185

原创 linux 使用tcpdump抓包

最近更换了服务器的消息队列,客户端反馈说服务器有时候会多发消息下去,十分纳闷,只改了服务器的消息队列,但是服务器像客户端发消息的代码一行没改,日志也只是发一条消息下去,但是因为改了消息队列,最后使用linux抓包看看,以证清白。tcpdump输出demo如下(这不是调试时的数据,只是demo)。这里我指定查看8060端口。root@mdev-2:/home/banfushen/webclient# tcpdump port 8060tcpdump: verbose output suppressed,

2021-07-21 17:50:09 177

原创 redis list插入失败,服务器与redis调试过程记录(redis连接列表,redis日志,redis监视着模式)。

前段时间在项目中碰到一个redis list插不进去的问题。背景是使用了redis list做消息队列,有两个服务器,server1存贮的redis string 类型的key的value是服务器1自己的mq1,server2要将消息插入server1的mq1。然后server1在读出这个mq1中存贮的消息。再去做一些业务操作。server1对mq1采用的是brpop,也就是阻塞的拿消息。下面将mq这个redis list的key成为mq1。我碰到了一个很奇葩的问题,server2从redis中读出了m

2021-07-20 21:29:02 638 1

原创 linux grep/ag 匹配反斜杠“\“,记录一下这个有意思的问题

今天项目中抓取日志的时候,因为日志打印出来的数据存是josn字符串,我要匹配的是这串\"userId\":\"867340f5-b992-4fe5-92cc-5390de659491\",按照经验,"和\是需要转换的,特殊字符串使用\做转换,"用"转义,\用\转换,在使用ag做匹配时这样写cat log1.txt | ag "{\\\"userId\\\\\":\\\\\"867340f5-b992-4fe5-92cc-5390de659491\\\","但是却没有结果经过尝试,发现原来\是

2021-06-10 17:02:46 938

原创 golang如何快速查询并发写map的位置(concurrent map iteration and map write)

最近项目中高并发时碰到golang碰到了map并发读写的问题。找问题找了好久,可以借助这个方发,编译的时候加上-race,在发生并发读写的地方会有提醒。go run main.go -race会出现DATA RACE,这张图是网上找的,我的的代码是项目代码,不好粘贴。这是一个方法,使用这个也会有所缺陷,例如你的协程就不能开太多了,我记得好像只能开8000多个。最后我的原因是因为一般一个变量会定义在循环之外(这不是理所应当的么,当时写的时候没想那么多,而又是自己的思路,找了好久没找到,最后领导找

2021-04-15 19:46:45 1321

原创 redis (error) MOVED 11863 xxx.xxx.xxx.xxx:6379

最近在集群中查询redis碰到这个问题,(error) MOVED 11863 xxx.xxx.xxx.xxx:6379简单查询后发现,是因为redis是集群方式的,而使用redis-cli连接redis的时候,没有指定集群模式,指定后即可。这样指定即可./redis-cli -h xxx.xxx.xxx -p 6379 -c...

2021-04-15 19:40:55 1622

原创 Redis中如何设置set中的元素过期

最近在工作中碰到了这个问题,我需要在一个set中记录集群中k8s pod的ip,但是pod随时会挂,所以采取一个定时让每个pod去update cache的做法。但是set中是无法设置其中元素过期时间的。有两个解决方法把set改用sorted set每个元素都带上分数,这个分数就是你的过期时间。先用ZRemRangeByScore删除过期元素(分数之外的元素),然后每个pod带上过期时间戳去定时去EasyZAdd,下面是伪代码for{ nowTime := time.Now().Unix() re

2021-04-15 19:30:53 6467

原创 Linux 运行程序时如何保存堆栈(Linux如何把标准输出和错误输出 输出到一个文件里)

最近在使用golang开发中,并发量达到一定程度时就会发生panic,想看堆栈,但是因为是跑在k8中的程序,输出都是直接输出到标准输出的。也没有日志。在本地调试的时候直接运行了go程序,输出也是一大堆,一下子就被刷掉了,所以要把输出输入到一个文件里。一般这样command > filename // 把标准输出重定向到一个新文件中// 例如./programmer > log.txt但是这样,如果发生堆栈错误还是会直接输出到屏幕。无法保存。使用以下方法command >

2021-04-09 18:30:51 543

原创 vs code golang代码不会自动对齐问题

本来使用vs做golang开发的时候,代码都会对齐的,忽然有一天,就不能对齐了。在网上找了好多都没找到答案,最后今天看了Effective Go前面的Formatting,觉得是这个东西出问题了。然后查看vs配置,File--->Preferences--->settting--->go![在这里插入图片描述](https://img-blog.csdnimg.cn/20210409175728336.png?x-oss-process=image/watermark,type_Zm

2021-04-09 17:58:52 1300

原创 从头开始读skynet源码(6)skynet.start服务器启动之后做了什么之thread_socket(skynet网络线程(一))

接上回,继续分析skynet网络线程。主要分析的是tcp网络线程执行代码如下。socket_server的创建skynet_state.c中调用的时候调用skynet_socket_init初始化void skynet_socket_init() { SOCKET_SERVER = socket_server_create(skynet_now());}struct socket_server * socket_server_create(uint64_t time) { int i;

2021-04-04 15:17:44 381

原创 从头开始读skynet源码(5)skynet.start服务器启动之后做了什么之thread_timer(skynet定时器)

继续按照skynet.start中的顺序分析。分析skynet定时器。启动各个线程都会做类似的初始化。定时器分析这里要做一个前置理解,定时器,是只需要关心最近即将到来的任务,而不用关心距离现在比较远的任务,例如1.你注册了100个定时任务,定时任务按照时间排序后2.A任务2s后触发,B任务3h后触发,C任务h后触发…3.当刷新时间的时候,需要去拿到即将到来的任务而需要关心之后的任务,这里就是只需要关心A任务,也就是你不需要去遍历所有任务列表拿到即将发生的任务,因为B之后的任务包括B,都不需要去关系

2021-03-21 21:48:14 231

原创 从头开始读skynet源码(4)skynet.start服务器启动之后做了什么之monitor(监视者)

monitormonitor分为服务器的monitor 和 skynet_monitor,整个服务器只有一个服务器monitor,每条工作线程绑定一个skynet_monitor,上面在声明了若干条线程数量后,先做的就是创建服务器monitor。服务器 monitor// 可以把服务退出的消息从框架层抛出来,让上层逻辑可以感知到struct monitor { int count; // 多少条工作线程 struct skynet_monitor ** m; // skynet_moni

2021-03-21 17:01:09 259

原创 从头开始读skynet源码(3)skynet.start服务器启动之后做了什么

俗事缠身,加上自己有点懒,skynet分析的事情拖了很久,之后尽快分析完。其实skynet是一个很优秀的框架,值得细读,多读(上加公司的老大这么对我说的,现在我也觉得是这样的)。skynet.star东西比较多,分四篇分析。下面直接进入正题。启动服务器skynet_start()start传入配置的线程数量,启动服务器。void skynet_start(struct skynet_config * config) { ... // 调用start传入配置线程数量 // 这个线程数量就是工作线

2021-03-21 16:54:12 232 1

原创 gitlab 一些操作命令记录

之前在上一家公司用的都是svn,现在使用gitlab。最近又在测试cicd,反复查询了一些命令, 也敲了一些命令,自己也记录一下,持续更新。git clone <addr> // 拷贝远程仓库到本地git status // 查看仓库当前的状态,显示有变更的文件(有的情况下文件增减看不到)git diff <file> // 比较文件的不同,即暂存区和工作区的差异。git add . // 添加文件到暂存区git co..

2021-01-30 14:25:51 221

原创 为什么数组遍历比链表快,从CPU和内存的角度理解。

回家的路上看了一下cpu的结构,想起了前两天和领导吃饭时聊到的问题,为什么数组遍历比链表快,明明都知道地址了。 其实要理解这个问题,从cpu的结构和内存角度来理解就很清晰了。 读取速度:缓存>内存(剧吐多少倍差距,得看什么cpu,大概都有100倍左右)。 cpu读取数据是按照缓存行读取到缓存的,简单来说就是cpu会把需要的数据加载到缓存中,查找数据时,会先从缓存找,找不到再到内存找。 而数组作为连续内存,cpu缓存会把一片连续的内存空...

2021-01-30 00:06:21 3756 13

原创 工作中第一次使用gitlab提交代码,到gitlab CICD自动部署到k8s碰到的坑,最终解决的过程。

背景我不是从头开始搭建,而是在已有部分条件的情况下进行,因为是我自己一个人负责集群中,一个服务器的重写,领导就叫我在gitlab上创建仓库,然后自己提交代码。我之前是没用过gitlab的,上一家公司的工作用的是svn,所以对我来说,一切都是未知。我的项目是golang写的。我的目的是:把项目打包成镜像—>上传到镜像仓库—>部署到k8s先建立仓库登录gitlab—>选择New project,会到一下页面,按照自己的情况填写这里有一点需要注意,当你创建完项目之后,会看到一些指引,

2021-01-26 21:02:22 1510

原创 golang 实际项目中连接redis集群碰到的坑

项目中redis直接是使用了aws的redis服务,redis是集群,也就是golang连接redis集群碰到的坑,如下 首先我使用的是redisgo,因为看着api比较方便,比较像redis-cli,而且aws也推荐。然后一开始连接也没事,我部署了不下10遍,然而有一天部署时。服务器在操作redis时忽然报错。“(error) MOVED xxxx xxx.xxx.xxx.xxx:xxxx”,经过查询得知这是由于redis没有选择连接集群导致的,再次查询,发现aws官方推荐了...

2021-01-26 11:06:04 3767 1

原创 golang 使用time包碰到数字与时间相乘的问题

在项目中使用time包时,睡眠时间时想要通过配置文件获取,然而整数与时间相乘又报错。如下查询time包发现// A Duration represents the elapsed time between two instants// as an int64 nanosecond count. The representation limits the// largest representable duration to approximately 290 years.t...

2021-01-25 20:46:01 3349 2

原创 nodejs aes192加密,在golang中解密碰到的坑

最近改写服务器,集群中服务器是nodejs写的,把其中一个服务器改成golang写的,碰到了nodejsaes192加密,再golang中解密碰到的坑,如下。 在nodejs中是这样加密的const encrypt = (toEncrypt) => { const cipher = crypto.createCipher('aes192', cryptoKey); let encrypted = cipher.update(toEncryp...

2021-01-25 20:35:23 1087

原创 怎么在linux中安装golang, 不需要在windows下载好包

其实我已经安装了很久了, 久到我已经忘记怎么安装了, 今天在k8s中调试时, 要重新装golang, 上网查了一下, 发现太多文章都是不太方便的, 例如现在windows下载好包, 再考到linux下解压, 有这么麻烦么, 下面直接上流程1.先下载golang的包这里网上好多文章都是在windows下搜索, 下载好拷贝过去, 其实不用这么干, 在linux中直接下载就好了我是debian 64位的系统, 工作目录是/usr/local. 这样下// 如果你看到这篇文章,可...

2021-01-21 19:12:29 200 1

原创 golang net/http包在k8s使用中碰到http: superfluous response.WriteHeader call from xxx的问题

在项目中,需要使用golang写http服务器并部署在k8s中,在server deployment.yaml中存在livenessProbe(存活探针)以及readinessProbe(就绪探针),这两个我都是写了向服务器发送一个http请求,如果服务器收到并回复,则表示成功,但是在使用过程中,日志一直输出,这些会干扰日志的查看。经过查询与测试,最后修复,做此纪录,代码如下。func healthcheck(w http.ResponseWriter, r *http.Reque...

2021-01-21 17:48:37 2805

原创 golang ”优雅关闭的 Go Web 服务器“,可能会碰到的坑。

在最近的项目中,使用了go 搭建了web服务器,所以"优雅的关闭服务器",经过查资料,发现go在1.8之后,http包已经有Shutdown()方法,但是使用起来还是有一些要注意的地方。 如果对go很熟悉的,对这些包很熟悉的人,肯定不会碰到这个问题。只怪我太菜。。。碰到了坑。下面直接上代码。 查询资料的时候,在网上看到这样的代码func gracefullShutdown(server *http.Server, logger *log....

2021-01-18 17:41:03 1136 1

原创 2020年我过的怎样

这篇博客其实想写了好久了,去年也写了一篇,感觉效果还不错,打算之后每年都回顾一下,也是对自己生活的一个记录。本来12月25左右就想写了,但又觉得太早了,想到最后一天在写。奈何又是各种事情(或者说自己没有狠下心来一定要写),所以拖到了今天。 ...

2021-01-02 16:14:41 160 1

原创 k8s中,启动pod失败,调试方法。

在k8s中,是不能够直接启动容器的,容器必须要依附于pod的形式启动。当pod启动失败的时候,可以这么去调试。 1.找到pod启动的镜像,将镜像进行二次封装,修改镜像的入口FROM xxxxx //pod启动的镜像ENTRYPOINT ["python", "-m", "SimpleHTTPServer", "8080"] //修改镜像的入口 2.将镜像上传到镜像库 3.修改pod的yaml文件,修改镜像地...

2020-12-21 18:45:20 2736

原创 k8s中,怎么在container中切换角色

工作中,需要在k8s中调试container,但是container中有可能很多东西又没有,比如vim等,没有就无法修改代码,想使用su 更改为root用户又不知道密码。可以使用以下方法。 直接修改pod的yaml文件containers: - name: ... image: ... securityContext: runAsUser: 0这样登录进去就是root角色,0指root用户的uid。在里面就可以安装自己想安装的工具进行调试。...

2020-12-21 11:20:40 1332

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除