Weakyon Blog

Weakyon

内存管理与伙伴算法

内存管理有两篇文章讲的还是满清晰的: 操作系统学习笔记-储存管理 The Linux Kernel-Chapter 3 Memory Management 下面这本书是有不少中文翻译的,可以自行查找 本文主要是讨论伙伴算法的,讲伙伴算法的文章虽然多,但是没几篇讲的很清楚的。我也是结合了几篇文章看了好久才弄明白,特地记下来。 使用伙伴算法能减少外部碎片,快速分配和回收资源。 伙...

twemproxy上做交并集合操作

业务线上出错,返回给用户的结果不正确。 使用了ZINTERSTORE这个接口对多个集合做交并集返回预期外的空集。如下图: 这是因为twemproxy只是把指令转发给redis而已,而多个集合被哈希算法分片在不同的redis节点上,所以转发这个redis并没有这几个集合,会直接返回空集。 这并不是BUG,redis3.0也存在这个特性,当多个集合做交并集操作时,需要使用hash_ta...

(nginx源码系列七)--nginx进程管理分析

由于twemproxy的多进程改造计划,所以对教科书一般的nginx的管理方式做了分析 nginx的-s指令可以对进程执行多个命令。 这些命令由主进程接受信号然后在循环中对状态进行判断,然后通过unix socket或者信号的方式传达给子进程。 从代码里面可以看到如下状态。 for() { if (delay) {} sigsuspend(); ngx_tim...

(nginx源码系列六)--sigsuspend的学习

twemproxy的多进程改造计划中参考了nginx的设计,然而nginx有一段让我看不太明白。 这篇文章总结的很好 sigsuspend sigprocmask函数的使用方法 sigsuspend将新的信号集阻塞操作和pause操作组合在一起成为原子操作 做了以下的操作 (1) 设置新的mask阻塞当前进程; (2) 收到信号,恢复原先mask; (3) 调用该进程设置的信号...

(nginx源码系列五)--nginx文件的内存缓存分析

nginx的文件缓存分为两种,内存缓存和硬盘缓存。 内存缓存指文件句柄等信息进行缓存,减少使用open等的系统调用。 硬盘缓存指文件被缓存到硬盘上,一般是因为当作反向代理用才会有这种需求。 内存缓存是全模块都可以调用的,因为封装在core/ngx_open_file_cache.c中。 而硬盘缓存只有http模块可以调用,因为封装在http/ngx_http_file_cache.c...

(nginx源码系列四)--nginx内存池分析

C的内存管理难已经成为了共识。记得我那时候写ydfs,第一次接触全异步编程这种模式,没有考虑到内存的统一管理,导致溢出泄漏问题层出不穷。最终搞定没BUG了,那代码的阅读质量也是让人不敢恭维。那么来看看nginx是怎么做的吧。 nginx的内存池分为池(pool)和块(block)两个概念 这是nginx使用到的内存结构 typedef struct ngx_pool_large_s ...

(nginx源码系列三)--nginx时间缓存分析

Why nginx把整个时间的系统调用都封装了一遍。 其中有两个原因 1 不谈其他平台,至少在linux上,很多时间相关的系统调用不是async-signal-safe或thread-safe的。 例如local_time_r虽然是thread-safe的但不是async-signal-safe的,当然local_time两个都不是。 这里不是专门谈什么是async-siganl-...

维护redis时的异常处理

现象一: 昨天DBA反应线上存在某个redis slave 状态为down,反复重启无效 观察slave日志: 发现出现多次全同步,并且报出connect lost同步失败。 Master日志没有任何记录。 原因分析: 根据netstat显示的slave未出现timewait状态,判断是master主动关闭了连接 而master只有在缓冲区达到限制(默认的参数client-...

(nginx源码系列二)--由读nginx源码想到的多进程下accept的处理方式

nginx的结构 stale event 多进程下accept的处理方式 nginx方式 ONESHOT方式 我的方式 小结 nginx源码本来应该放在nginx源码学习这一块。但是考虑到多进程下accept的处理可以单独拿出来讨论。所以还是单独一篇博客会比较好。 nginx的结构 简单提一下nginx的启动流程 核心文件当然是cor...

nginx模块开发的一些经验

fastdfs有nginx模块,在上面做一些缩略图缓存的功能。我当时总是觉得lua-nginx这种方式太重了,因此就入了nginx模块开发这个坑。 nginx模块开发的资料网上还是比较多的,《nginx模块开发与架构解析》这一本就不错,推荐入手实体书。我看PDF看的有点烦躁,因为很多东西要来回对照着看。 很多基础东西书里写的很细,就不谈了,就说说自己开发时候的过程和遇到的坑吧。 ngi...