Tango's Blog

总之岁月漫长,但却值得等待。

从操作系统漫谈GOLang GPM模型

前言 本文从操作系统谈起,简单介绍操作系统基本知识,引出进程、线程调度的基本原理和基本模型,然后从0到1设计Golang调度器,通过方案的逐步演进升级,可以了解到GPM模型设计理念。 阅读本文会了解到线程模型、线程调度,并最终理解Golang为什么设计为GPM模型,并通过简要runtime代码分析,验证在GPM模型推演过程中各种问题设想以及解决方案。 操作系统基础知识 本章节介绍操作系...

Device Map文件系统修改docker容器磁盘大小

最近在运维docker集群时,多次出现容器磁盘空间(/home)目录使用率过高问题,定位过程中发现/home目录默认限制是10G,显然无法满足线上的环境要求,因此需要在不停服条件下对容器/home磁盘空间进行扩容。 背景知识 要真正理解我们要做的事情,首先来了解 Device Mapper 插件的工作原理。 它是基于 Device Mapper 的“精简目标”的特性。它实际上是目标块设...

记一次文件删除bug查询

背景 线上服务接连多次磁盘空间不足报警,通过du和df命令查询磁盘使用空间,发现其显示结果明显不一致。 Du和Df区别 Du(Disk Usage)原理 du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。 它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。 如果针对的目录中文件很多,du速度就会很慢了。 Df(Disk F...

REDIS系列之源码分析

核心数据结构 redis用redisServer和redisClient结构体封装客户端和服务端的数据信息。在分析源码前先介绍一下其数据结构中包含哪些信息。 redisServer struct redisServer { /* General */ char *configfile; /* Absolute config file path, o...

REDIS系列之五大对象原理

Redis并没有采用上文介绍的底层数据结构实现键值对数据库,而是基于底层数据结构实现一套对象系统,包括字符串对象、链表对象、哈希对象、集合对象、排序集合对象。而且,每个对象的底层实现至少存在两种,针对不同的应用场景可以选择不同的实现方式,从而提高效率。 1.对象系统 Redis是key-value数据库,每创建一个键值对就会创建两个对象,即一个键对象,一个值对象。Redis中默认键是字符...

REDIS系列之底层数据结构

Redis是一款优秀的key-value数据库,其中存储的键值对都是有对象(Object)组成,可以存储字符串对象、哈希对象、列表对象、集合对象、有序集合对象;由于C语言中没有相关对象的实现,Redis自身扩种底层的数据结构实现上述对象的存储,本文将对REDIS数据库底层的数据结构进行介绍。 1. SDS字符串 Redis并没有直接采用C语言中字符串表示(以空字符结尾的字符数据,一下...

MySql系列之查询优化

如何建立最好的索引,对于高性能来说是必不可少的,但这些还不够-还需要合理设计查询。如果查询写的很糟糕,即是库表结构在合理、索引再合适,也无法实现高性能。   在进行查询优化之前,要明确的一点是,真正需要优化的是响应时间,查询由一个个小的任务组成,优化的目标要么是减少子任务数,要么减少子任务的执行时间,要么减少子任务执行次数。通常来讲,对于一个查询通常由几步完成: 从客户端到服务器,...

MySql系列之Innodb存储引擎

插件化存储引擎是MySQL特点,用户可以根据自己的需求使用不同的存储引擎,甚至通过抽象的API接口实现自己的存储引擎。innodb存储引擎支持行级锁以及事务特性,也是多种场合使用较多的存储引擎,本文将介绍innodb存储引擎。 存储引擎简介 mysql系统来说,存储引擎是真正实现数据的存储与读取操作的对象,数据库实例通过抽象API接口与存储引擎交互,存储引擎自定义实现数据的物理、逻辑组织...

MySql系列之架构浅析

  MySQL是一个开放源代码的关系数据库管理系统。原开发者为瑞典的MySQL AB公司,最早是在2001年MySQL3.23进入到管理员的视野并在之后获得广泛的应用。 2008年MySQL公司被Sun公司收购并发布了首个收购之后的版本MySQL5.1,该版本引入分区、基于行复制以及plugin API。移除了原有的BerkeyDB引擎,同时,Oracle收购InnoDB Oy发布了I...

MySql系列之源码浅析

源码才是王道。 1.MySQL源码 1. 主函数sql/mysqld.cc中,代码如下: //标准入口函数 int main(int argc, char **argv) { //调用mysys/My_init.c->my_init(),初始化mysql内部的系统库 MY_INIT(argv[0]); //初始化日志功能 logger...