自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

课前的博客

不积跬步无以至千里

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

原创 golang获取服务内存信息

以linux服务为例子,正常情况下,要获取服务内存信息可以通过相关的命令,例如top、ps等命令。这些监控内存使用情况的方法,一般需要编写脚本,执行脚本后将执行结果发送给对应的监控服务,从而达到监控的效果。但是golang自带的包却有一个runtime包,可以轻松获取服务运行时候的各种包括内存使用情况的信息。 使用linux命令,一般情况下只能看服务使用了多少内存。但是服务内存具体的使用情况缺

2017-05-12 00:33:25 19759 3

原创 记年前一次坑爹的联调记录

看看日期,马上过春节了。年前的任务很简单,就是联调。快过春节了,懂的都懂,大多数人心里都想着回家。结果前端做网关app的就把自己的工作量降到了极致。这个梗是这样的:首先,前端是做嵌入软件的,需要发送多个用户信息到后台,这边使用http发送过来。本来呢,直接使用json或者xml格式把用户信息放在body里面就ok了。一开始说好了,用json格式,结果一个星期过去了。联调的时候发现这大兄弟发过来的...

2020-01-17 14:41:14 367

原创 qps

在项目初期,一般我们要评估一下用户量,以及项目特点。一般情况下,读多写少的项目偏多。所以qps(每秒查询率 queries-per-second)就成了处理流量多少的衡量指标。下面先记录一下各种常见的术语。qps(queries-per-second) : 每秒能处理查询数目,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内锁处理流量多少的衡量标准。tps(transa...

2020-01-14 09:51:47 557

原创 服务集群化的思考

近期因为工作需要,将原有的分布式系统迁移到docker群集,每个服务会部署多个容器,使用服务发现。1、整改过程中发现原来进程中类似单例模式的变量访问,其实只要加个锁就可以了,但是如果每个服务部署多个容器,那其实进程内部的全局锁就没什么用了。这个就类似多个进程要公用一个唯一的可变的变量一样,这个时候就需要使用分布式锁或者服务拆分了。举一个例子,调用微信公众平台的接口一般需要用到一个access_...

2019-04-12 12:10:48 1145

原创 golang标准库中sync.Mutex性能测试

笔者原来是使用C++开发的,一直以为互斥锁时要是进程间通信中信号量的一个特例。在使用golang开发的时候,一直都很谨慎使用互斥锁,能用原子变量实现的就用原子变量实现。直到今天,测试了下golang标准库中sync.Mutex的性能以后,彻底的感觉到自己以前的无知和自以为是。经过笔者测试,两者的性能几乎没差异,有差异估计就是一点点封装消耗的性能成本。查看标准包中sync.Mutex实现的源码发现是...

2019-04-09 15:48:47 1598 2

原创 golang插件plugin从使用到放弃

前段时间使用beego框架开发了好多web接口,苦于beego框架对http接口的单元测试支持的不是很好,在迭代空隙修直接使用httprouter作为路由。然后写一个rest接口入参为新增接口uri、实现接口的.so路径和实现rest接口的...

2018-12-14 15:58:27 11980 4

原创 记一次rest_api监控提前发现潜在bug

花了大半年开发的项目要上线了,我在上线前一个星期把所有api都加上异常处理,如果api调用引发异常,都会把当前的调用栈和接口入参等信息保存到mongodb中。上线后,并没有收到bug处理通知。但是在mongodb中发现了一些异常数据。其中调用栈如下:"stack" : "goroutine 5297 [running]:\nerror.getFuncStack(0x0, 0xc420016e7...

2018-12-06 16:33:02 523

原创 mongodb小结(数据入库)

这段时间做了一数据统计后台,db的选型上使用了mongodb,原因比较简单,就是需要统计的字段会经常随着需求变化而变化。在数据入库方面,经过各种尝试,个人稍微总结了一下:一、插入方式:1、如果要使用insert,那么一般情况下,这些数据是改动比较小的,或者是不用修改的,比如插入一些流水数据。2、如果插入的数据可能字段基本是一致的,就只有稍微那么一两个字段不一样,那么可以考虑使用upsert...

2018-10-15 15:52:41 829

原创 遇到mysql数据库事务隔离级别相关的小坑

几乎所有软件工程师都知道,mysql有4种事务隔离级别,但是实际开发过程中可能有时候忽略这个小细节,有时候可能是本来就没有考虑过,有时候也可能是其他的原因,比如我这次踩到的小坑。事情还原:1、需求一:是新建一个商户,但是客户要求在创建商户的时候要默认给他们开一个管理员账户。其实很简单,就是新建一个商户,然后再新建一个账户,账户表中有一个字段关联商户。但是一看数据库隔离级别,是Read Comm...

2018-10-08 17:28:53 317

原创 golang中xorm包使用map[string]interface{}

前言:许久没发个人博客了,最近有点忙,很是怀念以前有时间写博客的日子。最近做各种后台服务,写了N个rest接口,其中有相当一部分是和mysql挂钩的,这时候就使用起了golang的xorm包。特意记录下使用时候用到map[string]interface{}的场景。一、map[string]interface{}的使用点:1、去掉加密操作后,一般rest接口使用的数据格式大多为json格式,...

2018-09-28 11:41:10 4960

原创 记一次关于golang使用xorm访问mysql事务不关闭引发的问题

事件还原:项目经理带客户体验公司的产品,发现机器前端提示网络异常,鉴于近期阿里云和腾讯云都发生过网络问题没有排查原因。过阵子,测试的同事跑去问qt前端的同事说网络这么久还异常啊。qt前端同事自己测试了一下,发现确实接口“有去无回”,就问了下后台的同事看看接口是否调的通。由于他们看的是心跳接口,后台同事一看,有些调用成功。然后就说可能是网络不稳定。ok,刚好后台同事写好需求同步服务后,qt前端的同事...

2018-07-31 11:51:50 2949

原创 linux中/proc/buddyinfo的作用

在应用程序设计过程中,内存是很重要的资源,而计算机主机的内存资源时有限的。一般而言我们可以申请到的内存是有限的,并不是想申请多大就有多大就可以申请多大的。/proc/buddyinfo文件里,就记录着系统的内存资源。linux内核中使用了buddy算法来管理内存以减少内存碎片的产生,buddy算法管理最小的单一为PAGE_SIZE,一般情况下大小为4K。以2的N次幂一次增加。如下图表示,在no...

2018-03-29 18:21:33 4681

原创 每天回顾linux命令(top)

前言 top命令可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。并提供了互动界面,用热键可以管理。语法 top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]选项 -b:分批次显示结果。每次刷新的时候,是以追加的形式,而不是覆盖。 -c:显示完整的命令。

2018-02-02 16:37:57 351

原创 mongodb性能优化---golang篇

一般来说nosql的插入速度会比mysql等关系型数据库的要快些才对,上次用golang实现了可以在mysql中以2W+/s速度的插入小数据。理论上mongodb的插入速度应该会比mysql快。但是经过测试发现,每次往mongodb插入一条数据的话,插入速度只有1600次每秒。测试代码如下:package mainimport ( "fmt" "log" "ti

2018-01-31 18:27:27 5332 21

原创 每天回顾linux命令(iotop)

前言 iotop命令是一个用来监视磁盘I/O使用状况的top类工具。和top有相似的UI。可以很直观的看出每个进程如何使用IO。在一些读写要求比较高的服务,比如数据库服务,经常会使用该命令来监视磁盘的使用状况。iotop在新安装的linux下一般是没有的,需要用户自己安装,还有就是一般需要管理员权限才可以执行。语法iotop (选项)选项 -o:只显示有io操作的进程。 -b:批量显示,无

2018-01-30 11:22:19 397

原创 C++11 forward_list

C++11 中forward_list是一个单向链表,单向链表有其对应的有缺点吧。总体上其有缺点都不是很明显,所以不是很常见。主要还是用做优先级队列会比较合适。1、构造函数 —-默认构造,返回一个空链表 —-两个参数,一个为正整型n,一个位对应存储结构x,初始化n个节点,所有节点值位x —-两个参数都为对应结构的迭代子。创建一个新链表,内容为两个迭代子

2018-01-30 10:59:48 412

原创 C++11 bitset

C/C++比较多的会应用在相对比较底层的服务,所以有可能会遇到位操作。在结构体中会有位域来简化位操作。这里,来介绍下C++11标准库中bitset的使用。1、构造函数 —默认构造,所有位都为0 —入参为对应数值类型 —入参为string 例子:// constructing bitsets#include // std::cout

2018-01-26 17:48:39 670

原创 每天回顾linux命令(df)

有一段时间没有复习linux命令了,其实这些都是对于开发来说都是比较基础的东西,日常一般日常都会遇到。平时没事干的时候,可以考虑花点心思来回顾一下,百无一害。 df命令 用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,剩下多少空间等信息。在日常监控的时候,一般就是使用df来监控磁盘的使用情况的,比如当磁盘使用量超过80%,需要提示运维人员。可以

2018-01-26 16:15:25 241

原创 C++11 array

大学期间没有学过C++,大学毕业后开发主要的语言是C++,其实应该说是C++98。看了c++ primer等书籍,有好多感觉都用不着。后来接触了golang,渐渐的发现C++98用起来很不方便。现在学习C++11发现,其实C++11已经和现在很多高级语言使用起来一样方便了,且不失去其高效性。所以,C++没有GC。后续,将慢慢学习C++11,从array开始记录吧。先不研究内部实现,后续再深入研究

2018-01-26 15:39:23 2519

原创 C++大内存申请

1、未始化的全局变量 代码:int szTestData[1024 * 1024 * 1024] = {0};int main(){// int* piTestData = new int[1024 * 1024 * 1024]; return 0;}结果: 可以编译通过 但是运行结果为Segmentation fault (core dumped)

2018-01-26 12:06:30 3157

原创 使用golang插入mysql性能提升经验

前言golang可以轻易制造高并发,在某些场景很合适,比如爬虫的时候可以爬的更加高效。但是对应某些场景,如文件读写,数据库访问等IO为瓶颈的场合,就没有什么优势了。前提基础1、golang数据库访问 在golang中数据库访问使用”database/sql”包提供的接口,不同的数据库,比如pg、mysql只需要提供对应的驱动就可以了。注意”database/sql”包提供的接口只针对关系型数据库,

2018-01-03 20:10:54 16020 4

原创 每天回顾linux命令(users)

users命令users命令用于显示当前登录系统所有的用户的用户列表。每个显示的用户名对应一个登录会话。如果一个用户不止一个登录会话,会重复显示。语法user (选项)选项 –help: –version: 没啥用。。。。也一般不用例子:lfwzm@ubuntu:~$ userslfwzmlfwzm@ubuntu:~$

2017-12-21 11:12:45 2795

原创 每天回顾linux命令(uptime)

uptime命令 uptime命令是linux中的一个维护命令。一次显示:当前时间,系统已经运行了多长时间,目前登录用户个数、系统过去的1分钟、5分钟和15分钟内的平均负载。关于系统平均负载的说法: 系统平均负载是指在特定时间间隔内运行队列中的平均进程数。 如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的。如果每个cpu内核的任务数大于5,那么说明该系统的性能有严重问题。

2017-12-14 17:53:16 609

原创 每天回顾linux命令(du)

前言du命令对应开发人员来说,可能用的比较少。但是对应维护人员等需要定位linux的一些问题的人员来说,可能会用的比较多。不过开发测试运维一体化应该是以后的趋势,单纯的开发可能会越来越少了。有一次,系统包了个磁盘空间不足的告警,一般情况下,就以为是数据库文件占用了大量的磁盘空间。然后发现数据库里边的数据根本就不够。来定位该问题,首先就是使用df看看是哪个盘满了,发现不在数据库所处的磁盘空间。心里的石

2017-12-14 17:24:18 287

原创 明天回顾linux命令(kill)

kill命令kill命令用来删除执行中的程序或工作。kill可将制定的信号送到程序。预设的消息为SIGTERM(15),可将指定程序终止。若仍无法终止程序,可使用SIGKILL(9)信号尝试强制删除程序。程序的pid可以利用ps或者job命令查看。语法kill (选项) (参数)选项 -a:当处理当前进程时,不限制命令名和进程号的对应关系。 -l <信息编号>:如果不加信息编号选项,会列出所有的

2017-12-06 18:14:39 305

原创 golang基础(基础包链表使用)

前言golang版本包中提供了三种数据结构:list、heap和ring。已经golang的基本数据类型map。这4中数据结构算是日常开发中最常用的数据结构了。最常用的应该是map所以,golang才会将其作为基本类型。golang提供的这些数据结构,并没有保证并发安全的情况。所以最好在开发的过程中操作的时候要加锁,避免造成不必要的麻烦。也不用吐槽为什么map抛出一个不能同时读写的error。lis

2017-12-05 18:39:38 2661

原创 golang基础(unsafe包使用)

前言在使用C/C++过程中,很多时候出现的错误都是由于指针操作不合理,导致各种奇奇怪怪的问题。但是,也是由于指针的存在才让C/C++代码的运行效率比其他语言的略高。golang也有指针类型,但是不允许直接对指针类型进行运算。就是像保留指针的有点,规避掉由于指针操作不当而引发的各种奇怪问题。但是有些时候确实需要使用到指针运算的时候,就需要使用到unsafe包了。为什么要用unsafe包呢,说白了,就是

2017-12-05 16:35:36 1885

原创 每天回顾linux命令(reboot)

reboot命令reboot命令用来重新启动正在运行的linux操作系统语法reboot (选项)选项 -d:重新开机时不把数据写入记录文件/var/tmp/wtmp。本参数具有“-n”参效果。 -f:强制重新开机,不调用shutdown指令的功能。 -i:在重新开机前,先关闭所有的网络界面。 -n:重新开机前不检查是否有未结束的程序。 -w:只做测试,并不真正将系统重新开机,只会把开机的

2017-12-05 09:29:54 367

原创 golang基础(golang压缩文件gzip)

前言曾经,因为不够注重基础吃了好多亏。总是很喜欢去看那些高大上的东西,却忽略了最基本的东西。然后会错误的以为自己懂的很多,但是其实是沙堆中筑高台,知道很多高大上的架构,但是基础的东西却不太了解。我觉得,可能这就是大部分开发工程师的通病吧。正题在软件很多应用开发过程中,经常需要使用到文件压缩。有时候是为了加快存盘速度,有时候是为了节省硬盘空间,有时候是为了提高传输效率。gzip是一种比较通用的压缩程序

2017-12-04 19:11:46 10198 2

原创 学习回顾算法(插值查找算法)

插值查找算法概述插值查找算法,是二分法查找算法的改进。将查找点的选择改为自适应选择,可以提高查找效率。 算法注意点和二分法查找一样,都需要列表先排好序。插值查找算法实现1、golang实现package mainimport ( "fmt")func InsertionSearch(values []int, key int) int { if len(values) == 0

2017-12-04 13:10:47 396

原创 学习回顾算法(二分法查找)

二分法查找概述二分法查找也称为折半查找,属于有序查找算法。用给定值key先和中间结点的关键字比较,中间结点把线形表分成两个字表,若相等则查找成功;若不相等,再根据key与该中间结点关键字的比较结果确定下一步查找哪个字表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。前提条件 列表中元素必须是有序的,如果是无须的则需要进行排序操作。二分查找示例 假如有一组数为1,3,5,7,9,11,

2017-12-04 11:04:50 335

原创 学习回顾算法(顺序查找算法)

顺序查找算法概述顺序查找算法是在一个已知无序(或有序)队列中找出关键字相同的数的具体位置。顺序查找算法原理 让关键字和队列中的数从最后一个开始逐个比较,直到找出与给定关键字相同的数为止。如果扫描结束已让没有找到关键字,表示查找失败。顺序查找算法分析 时间复杂度: 平均:假设每个数据元素的概率相等 (n + 1)/2 查找不成功:n+1 复杂度:O(n)实现1、golang实现(元素为int

2017-12-04 10:17:06 461

原创 每天回顾linux命令(id)

id命令id命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID是对一个用户单一身份的标识。组ID(GID)则对应多个UID。id命令默认预装在大多数linux系统中。

2017-12-04 09:21:35 294

原创 每天回顾linux命令(su)

su命令su命令用于切换当前用户到其它用户身份,变更时须输入所要变更的用户账号与密码。语法-c 命令或–command=命令:执行完指定的命令后,恢复原来的身份。 -f或–fast:使shell不用去读取启动文件。 -l或–login:改变身份时,也同时变更工作目录。也会变更PATH变量。 -m或-p或–preserve-environment:变更身份时,不变更环境变量。 -s shell

2017-11-30 13:55:15 211

原创 每天回顾linux命令(renice)

renice命令renice命令可以修正正在运行的进程的调度优先级。预设是以持续识别码指定程序调整其优先权。也可以用指定程序群组或用户名称调整优先权等级,并修改所有隶属于该程序群组或用户的程序的优先权。只有系统管理者可以改变其他用户程序的优先权和设置负数等级。语法renice (选项) (参数)选项 -g:指定进程组id; -p 程序pid :改变该进程的优先权等级 -u:指定开启进程的用户名

2017-11-29 10:57:23 420

原创 每天回顾linux命令(who)

who命令who命令可以打印当前登录到系统中用户的相关信息。who命令只会显示真正登录到系统中的用户,不会显示那些通过su命令切换用户的登录者。在大多数linux发行版中,who命令都是默认安装上的。语法who (选项)选项 不加参数:显示当前所有登录到系统中的用户相关信息。 输出项: 第一列:显示用户名称 第二列:显示用户连接方式。tty表示用户直连主机,pts表示远程登录 第三列:

2017-11-28 10:06:44 516

原创 每天回顾linux命令(nice)

nice命令 nice命令用于以指定的进程调度优先级启动其他的程序语法nice (选项) (参数)选项 -n:指定进程的优先级(-19~20),数值越低,优先级越高,程序不指定的话优先级为10root@aad1c1a83775:/home/wzm# nice -1 lstest test.txtroot@aad1c1a83775:/home/wzm#

2017-11-27 17:18:05 432

原创 每天回顾linux命令(last)

笔者对last和who命令印象比较深刻。 背景 当时在公司测试的地位很高,如果测试到开发这边有什么问题,一般都要开发组织开会回顾为什么会出现对于的问题。慢慢的,测试那边遇到问题越来越不懂脑子就让开发定位问题。 发生了什么事 一名测试人员发现页面突然报错,服务器无法访问,刚好那个时候刚刚让我接手页面前后台两部分责任田。服务器无法访问,这些一般只有后台挂了,或者出现比较严重bug的时候才会出现。

2017-11-27 17:06:48 247

原创 每天回顾linux命令(whoami)

whoami命令 whoami命令用于打印当前有效的用户名称,相当于执行 -id -un命令语法whoami无特殊用法root@aad1c1a83775:/# whoamirootroot@aad1c1a83775:/#

2017-11-27 16:21:06 248

原创 每天回顾linux命令(date)

date命令date命令是显示或设置系统时间和日期很多shell脚本里面需要打印不同格式的时间或日期,以及要根据时间和日期执行操作。日期可以以多种格式去打印,也可以使用命令设置固定的格式。在unix类操作系统中,日期被存储为一个整数,其大小为自世界标准时间(UTC)1970年1月1日0时0分0秒起逝去的秒数。语法date (选项)(参数)选项 不加参数:按照系统固定的格式显示当前的系统时间。roo

2017-11-27 16:13:39 422

空空如也

空空如也

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

TA关注的人

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