本文来自Nginx官方博客,这是微服务架构序系列的第四篇文章。作者总共发布了七篇关于微服务的系列文章,在第一文章中介绍了传统的单体式应用的不足,以及微服务架构的优势与挑战。在第二和第三骗文章中描述了微服务内部通信方面的内容。在这篇文章中,主要探讨微服务系统的服务发现的相关问题。
使用memcache时碰到的坑
问题描述
向memcache插入数据时立即返回错误,代码为47。通过tcpdump查看直接返回了rst
解决
经过一番查找之后,发现这是一个非常弱智的问题,memcache连接超时时间默认单位是毫秒,我们错误地认为是秒,设定为1,表示超时时间是1毫秒,所以一连接就超时。
|
|
sar 找出系统瓶颈的利器
很多系统负载过高的时候我们是无法立即获知或者立即解决的,当检测到或者知道历史的高负载状况时,可能需要回放历史监控数据,这时 sar 命令就派上用场了,sar命令同样来自sysstat工具包,可以记录系统的CPU负载、I/O状况和内存使用记录,便于历史数据的回放。
Ubuntu系统上,sysstat的配置文件在/etc/default/sysstat,sysstat默认关闭,通过将该文件中的ENABLED改为”true”启用;历史日志的存放位置为/var/log/sysstat
Red Hat系统上,sysstat的配置文件在/etc/sysconfig/sysstat文件,历史日志的存放位置为/var/log/sa
两种系统上,统计信息都是每10分钟记录一次,每天的23:59会分割统计文件,这些操作的频率都在/etc/cron.d/sysstat文件配置。
strace 跟踪进程中的系统调用
简介
strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
lsof命令
简介
lsof(list open files)是一个查看当前系统文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,该文件描述符提供了大量关于这个应用程序本身的信息。
lsof打开的文件可以是:
- 普通文件
- 目录
- 网络文件系统的文件
- 字符或设备文件
- (函数)共享库
- 管道,命名管道
- 符号链接
- 网络文件(例如:NFS file、网络socket,unix域名socket)
- 还有其它类型的文件,等等
I/O模型
Unix 下有5种可用的 I/O 模型,如下:
- 阻塞式 I/O
- 非阻塞式 I/O
- I/O 复用(select 和 poll)
- 信号驱动 I/O
- 异步I/O
对于一个套接口上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被拷贝到内核中的某个缓冲区。第二步就是把数据从内核缓冲区拷贝到应用进程缓冲区。
阻塞式 I/O
最流行的 I/O 模型是阻塞式I/O模型,默认情况下,所有套接字都是阻塞的。以数据报套接字为例,如下图所示:
进程调用recvfrom,其系统调用直到数据报到达且被拷贝到应用进程的缓冲区中或者发生错误才返回。进程从调用recvfrom开始到它返回的整段时间内是被阻塞
的。recvfrom成功返回后,应用进程开始处理数据。
位图
定义
位图(bitmap),就是用每一位来存放某种状态,适用于数据规模大且状态不多的情况。通常是用来判断某个数据存不存在。
在STL中有一个bitset容器,其实就是位图。
优点
节省空间,比如用1bit代表一个unsigned int类型整数,相当用1bit表示32bit数据,存储空间缩小至1/32
缺点
- 可读性差
将数据抽象为bit不利于理解,尤其是用多个bit位来表示一个数时。 - 存储离散数据空间利用率低
Bitmap申请空间时要根据最大的数来决定申请的空间大小,如果数据是离散的,那空间的利用率就会非常低。 - 不适合多状态
一个bit只能表示两种状态,如果要表示更多的状态,就需要更多的状态位来实现。如果一个数字需要多个状态位来表示的话,Bitmap的优越性也会大打折扣,而且复杂度却在增加。 - 位图元素虽然比一般做法多,但是存储的元素大小受限于存储空间大小。
能够存储的元素的最大值受限于存储空间的元素的个数。比如1K字节内存,能够存储8K个值大小上限是8K的元素。要存储值为65535的数,就必须要65535/8 = 8K 字节的内存。 - 位图对有符号类型数据的存储,需要2位表示一个有符号元素。折让位图能够存储的元素个数以及元素值大小上限减半。例如8K字节内存空间只能存储8K*4 = 32K个,元素值大小方位为-32K~32K
redis笔记
什么是redis
Redis是key-value型的内存数据库
Redis是单线程的
默认端口为6379
启动
redis-server /usr/local/redis/etc/redis.conf
如果需要后台运行,修改redis.conf中的daemonize为yes