自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(257)
  • 收藏
  • 关注

原创 [redis] sentinel

要点:1.sentinel 为redis哨兵,其与redis公用一个代码2.sentinel有主观认为master挂掉sdown,和当有多少个sentinel认为master挂掉后的客观挂掉odown3.odown发生后,进入failover,会进行master选举,这里当大多数sentinel认为某个slave可以充当master的时候,会进行切换4.slave的发送通过mast...

2021-09-09 11:29:35 180

原创 [c/c++] tcmalloc大空闲内存不释放问题

一、现象1.线上服务(内存分配采用tcmalloc)出现瞬时内存上涨的情况(如按G级别上涨),且长时间不释放内存。二、问题定位1.确定内存是泄漏还是tcmalloc的空闲内存(我这边的是空闲内存,并不是内存泄漏)1)可以通过增加代码,支持打印tcmalloc内存分配统计信息。 char* stats_buffer = new char[4096]; MallocExtension::instance()->GetStats(stats_buffer, 409..

2021-07-22 16:01:06 5820

原创 [qemu] 桥接模式,ifconfig -a只有lo本地网卡

一、现象1.按照网上的教程,编译linux内核,编译qemu,编译busybox2.主机建立桥接br0,对应的两个port,tap0和eth03.qemu启动,使用tap0进行桥接网络配置,一般启动方式:qemu-system-x86_64 -m 1024M --kernel linux-4.4.216/arch/x86/boot/bzImage -hda ./ext4_root...

2020-03-19 12:51:44 3041

原创 [linux_内核相关] x86_64下进程切换schedule理解

一、背景schedule作为内核进程切换的入口,用于选择一个新的进程进行调度。 二、函数内部重要方法schedule     |---------->__schedule(false)                                |---------------->pick_next_task(进程选择策略,从中选择一个的进程)      ...

2018-11-19 15:57:58 885

原创 [linux_内核相关] 自制启动x86_64架构下的linux(qemu+grub2+busybox+vmlinuz+登录配置+网络配置)

 一、名词说明qemu:虚拟机,用于模拟某种机器的物理架构,这样我们可以模拟从开机加电到最后的操作系统的启动grub2:bootloader,用于加载linux内核(vmlinuz)和initrd(ram disk,内存文件系统)busybox:用于制作最终的根文件系统(rootfs),也就是我们在ubuntu等发行版操作系统下的根目录/ram disk(initrd, ini...

2018-10-23 13:12:40 4746

原创 [linux] x86_64, 线程栈如何分配的

一、背景我们知道一个进程的空间地址可以大致划分为代码区(text)、只读数据区(rodata)、初始化数据区(data)、为初始化数据区(bss)、堆(heap)、共享内存区(.so,mmap的地方)、栈(stack)、内核区(kernel)。堆:自底向上增长栈:自顶向下增长其中这里的栈可以说成是进程栈(或者是主线程栈),但是当主进程(主线程)之外创建了新的子线程,我们都知道线...

2018-09-10 17:51:50 2084

转载 [redis] crc16

一、背景redis集群使用哈希槽实现,其对key进行哈希计算采用crc16(key) & 0x3fff,得到在16384个槽的其中一个,每个槽对应一个redis节点,如果为当前节点则执行请求,否则返回重定向节点操作 二、crc16如下图,redis的实现:/* CRC16 implementation according to CCITT standards. *...

2018-09-05 19:30:45 1688

原创 [linux] mmap内存映射

一、要点1. 内存布局,代码段-数据段[data,bss]-堆-内存映射区-栈-内核区2.经实践,内存映射区(linux x86-64 4.4.0-117-generic)自顶向下 3.按需调页,当访问一个虚拟地址,发生缺页错误后,会进行按需调页,如果合法,分配物理内存,文件内容填充数据4.匿名内存映射,不需要文件,即分配物理内存不需要物理文件数据填充5.write on co...

2018-08-21 12:00:37 157

原创 [c/c++] linux下变量和函数的动态链接说明

一、简要背景1.linux平台,64位2.使用.so文件,动态绑定3.说明基于elf文件elf(可执行和链接格式文件),即其有两种视图,一个是执行视图(也可以叫程序加载视图,用于将文件加载到内存中并可以执行的视图)图右。另一个是链接视图,用于给链接器在链接阶段使用,图左。如图: 二、例子fun.h#ifndef _FUN_H_#define _FUN_H_...

2018-08-20 13:51:54 511

原创 [linux] xargs

一、描述    xargs - build and execute command lines from standard input    将标准输入的数据建立成命令行模式二、例子find ./ -type f | xargs则会将当前目录下的所有文件,形成命令行的参数find ./ -type f | xargs grep keyword --color1.grep keyword files...

2018-05-22 15:23:37 123

转载 [linux] diff和patch

链接:https://www.cnblogs.com/cocowool/p/6409643.htmlLinux中的Diff和Patch本文主要记录两个命令的学习情况:diff 和 patch。diff 和 patch 是一对工具,使用这对工具可以获取更新文件与历史文件的差异,并将更新应用到历史文件上。在数学上说,diff就是对两个集合的差运算,patch就是对两个集

2018-05-03 17:37:55 190

原创 [redis] 内存淘汰策略

一、描述redis默认是没有设置maxmemory字段的,maxmemory为redis进程的最大内存,单位字节二、maxmemory-policy当设置了maxmemory字段的时候,即限制了进程的内存大小,那么当redis的存储数据量大于该设置值后,便需要想办法将redis中的数据删除,以空出空间来保存新的存储需求三、参数maxmeory-policy有

2018-04-22 14:26:32 691

原创 [zookeeper] zab协议

一、描述zab(ZooKeeper Atomic Broadcast原子消息广播协议),是zookeeper一致性协议,zab协议主要包括两种模式,消息广播和奔溃恢复二、角色zookeeper中主要的两种角色,leader和follower,这两种角色都有投票权三、消息广播1.follower收到prosoal等写事务的提议2.follower会发送给lea

2018-04-15 14:37:41 200

原创 [redis] rdb-dump.rdb

一、描述rdb(redis databses)redis的其中一个持久化数据方式(默认),是rdb模式,简单说就是会再一定的触发条件下,会启动子进程生成dump.rdb(快照文件)二、源码解析2.1 src/rdb.c:rdbSaveBackground代码逻辑:1.fork(),创建出子进程2.子进程调用rdbSave函数,完成实际的dump操作

2018-04-14 15:02:36 2011

原创 [redis] zset数据结构

一、描述redis其中一个数据结构为zset(sorted set-有序集合),其主要作用用于排行榜实现,你可以获取排名第几到第几的数据二、数据结构sorted set-有序集合在redis中有两种实现1.ziplist,压缩双向链表,相关链接2.skiplist,跳表实现三、skiplist数据结构score:分值,用于排序backward

2018-04-14 14:28:20 11204

原创 [redis] set数据结构

一、描述redis的一个类型set(集合)二、redis其内部实现1:hashmap(hash table)散列表实现,key=value,  value=null即可,散列表相关链接2:intset-可以理解为正数有序数组三、intset的数据结构定义contents:字节数组,其可以有16bit,32bit,64bit编码成整数的方式enco

2018-04-12 23:29:42 859

原创 [redis] list数据结构

一、描述redis的一个数据结构为list(双向列表)二、数据结构定义struct quicklistNode *prev;struct quicklistNode *next;从prev和next都是当前该数据结构quicklistNode的定义,再查看其他数据如sz,count等都不能表示存放的数据,因此实际quicklistNode的数据存储功能是交由zi

2018-04-12 21:26:02 313

原创 [redis] hashmap数据结构

一、描述

2018-04-12 21:05:22 4090

原创 [redis] ziplist-压缩双向链表

redis ziplist-压缩双向链表

2018-04-12 20:32:19 2061

原创 [redis] linux下网络处理模块

一、描述1.linux下redis默认才用epoll来完成io的多路复用,将当前需要监听的io事件交由操作系统来完成。当有相应关注的io事件到来的时候,操作系统则会通知用户程序相关的信息,这样即使采用单线程也能监听多个io事件。2.采用单线程来处理网络请求,除了1的epoll外,还有两个原因:2.1 redis的数据结构是基于内存来实现的,因此其效率极高,即使单线程也能得到很高

2018-04-09 21:40:37 570

原创 [redis] 概述

一、概述1.redis作为nosql数据库的代表,在工作中主要用户分布式内存cache来使用。可以简单理解为常用的数据结构在独立服务器实现了。2.redis是key-value数据库,其key-value由hashmap数据结构来存储,key为字符串类型,而其value则可以为多种数据结构类型。如:string(字符串类型),hashmap(散列表类型),set(集合类型),list(

2018-04-09 21:03:03 162

转载 [mysql] packet

转载地址:https://dev.mysql.com/doc/dev/mysql-server/8.0.0/page_protocol_basic_packets.html一、packet意思packet并不是mysql的procotol(协议),而是如何将协议数据准确发送甚至如何拆分过长的协议数据的更下层的支持。二、packet结构| length(3-bytes) |

2018-04-08 11:22:25 532

转载 [Linux]创建和启用Swap交换区

转载:https://www.cnblogs.com/zsummer/p/4808422.html如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不增加物理内存的情况下,启用swap交换区作为虚拟内存是一个不错的选择,我购买的DigitalOcean VPS 512M内存基本不够用的,好在VPS的母鸡使用的SSD,正常读写速度都在300MB

2018-04-05 13:55:23 7293

原创 c offsetof-计算结构体内成员的偏移值

1.作用:计算结构体内成员的偏移值2.使用场景:可在结构体内定义数据结构的节点类型,相当于内嵌数据结构3.例子(内嵌list数据结构):例子代码:#include <stdio.h>#include <stdlib.h>#include <stddef.h>typedef struct ListNode {    struct ListNode *n...

2018-03-16 11:55:17 416

原创 linux 文件锁-进程间同步

一、场景    多进程间同步除了信号量、共享内存(原子操作)同步外,还可以使用文件锁来实现。二、实现    linux中有两种是方式,分别是flock()函数和fcntl()函数。使用效果大致相同    flock函数:    fd:文件描述符    operation:LOCK_SH(添加共享锁,相当于读锁),LOCK_EX(添加排他锁,相当于写锁),LOCK_UN(去除添加到文件的锁,解锁),...

2018-03-08 18:07:08 1870

转载 time_wait,不要乱用tcp_tw_recycle和net.ipv4.tcp_tw_reuse

转载链接:https://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux#fn-rfc1337服务器端time_wait满了后,客户端相同的port为什么还能正常被请求: When a connection is closed actively, it MUST linger in

2018-01-17 00:28:23 1272

转载 tcp options

TCP Options 当前,TCP常用的Option如下所示————Kind(Type)LengthNameReference描述 & 用途01EOLRFC 793选项列表结束

2018-01-15 12:38:16 747

原创 tcp option

一、奇怪现象:三次握手时,前两次syn|syn+ack中的window size明明很大,但是第三次握手的时候window size却突然变得很小,并且后续的数据传输的过程中,window size仍然很小,和syn|syn+ack中的不符,对于我们初探tcp的学习者来说,会一头雾水,其实是我们只关注了tcp的重要点,而没有了解到tcp的小细节。二、tcp option:

2018-01-15 12:36:03 3254

转载 网络虚拟化中的 offload 技术:LSO/LRO、GSO/GRO、TSO/UFO、VXLAN

offload现在,越来越多的网卡设备支持 offload 特性,来提升网络收/发性能。offload 是将本来该操作系统进行的一些数据包处理(如分片、重组等)放到网卡硬件中去做,降低系统 CPU 消耗的同时,提高处理的性能。包括 LSO/LRO、GSO/GRO、TSO/UFO 等。LSO/LRO分别对应到发送和接收两个方向,是 Large Segment Of

2018-01-11 22:16:23 568

转载 tcpdump

关键点:sudo tcpdump -i eth1 host www.baidu.com -S -xx -n监控网卡eth1,host或者ip为www.baidu.com的,-xx打印链路层级别的协议,-n地址转换为实际数字,-S ack用实际数字表示(避免1)链路层协议(以太网协议):http://blog.csdn.net/shenxin870409/article/deta

2018-01-08 23:36:03 2085

原创 socket网络编程

一、常规socket通信1.socket,创建socket fd2.bind,将要监听的ip和端口绑定到socket fd中3.listen,设置等待队列长度,并且开始监听端口4.accept,阻塞等待,直到有已经连接的socket,获取其fd进行read操作基于事件的socket通信1.前三步不变,1,2,32.唯一改变的是accept,accept为应用程序

2018-01-06 17:49:30 245

转载 c fflush vs fsync

fflush:是把C库中的缓冲调用write函数写到磁盘[其实是写到内核的缓冲区]。fsync:是把内核缓冲刷到磁盘上。 转载文章:http://blog.chinaunix.net/uid-1911213-id-3412851.html

2018-01-04 11:07:01 609

转载 c++ 虚拟继承,gcc内存分布情况

转载路径:http://www.oschina.net/translate/cpp-virtual-inheritance

2018-01-02 00:07:15 306

原创 stl std::forward

作用:用于模板的代理函数中参数转发,而能够保持参数的实际类型例子:#include #include void add(int& a, int&& b, int c, int *d) { std::cout << a << std::endl; std::cout << b << std::endl; std::cout << c << std::

2018-01-01 12:19:32 475

转载 引用折叠

x& &=x&x& && = x&x&& & = x&x&& && = x&&参考c++ primer 第五版

2018-01-01 00:14:30 164

原创 c++ vtable 虚函数表

1.作用:用于有虚函数对象的指针,其在运行期间决定实际应该执行的函数的地址2.内存布局:内存的开头位置(64位),即内存开头8字节内容为vtable的的地址值而vtable的顺序存放函数地址值(64位顺序数组)3.代码调用:#include #include class P { public: virtual void test() {

2017-12-29 15:38:20 586

转载 右值引用

右值引用,更多是一种规范,是程序员和编译器的写协作。右值引用的使用,是编译器允许程序员直接访问临时变量(你用右值引用,编译器也安常规认为其是临时的,会很快被销毁的对象,可能实际并不是,可能是左值转换过来的),并不是你用了右值引用,就能直接得到效率的提升的,需要你定义移动构造函数甚至是移动赋值函数,在函数内部,你可以获取得到访问临时变量的能力,而不是通过拷贝得到,你可以将该临时变量的资源

2017-12-29 01:04:58 203

转载 磁盘没有我们想象的那么慢

内存的访问速度比硬盘快,这是毋庸置疑的,但是到底快多少?通常的说法是:内存访问速度是纳秒级(10的-9次方),硬盘的访问速度是微秒级(10的-3次方)。找到一个稍微科学点的测试数据,如下图要对比内存和硬盘的速度,要分为两种请款对比:1.顺序访问:这种情况下,内存访问速度仅仅是硬盘访问速度的6~7倍(358.2M / 53.2M = 6.7)2.随机访问:这种

2017-12-28 17:51:35 176

原创 stl 算法 简略

排序算法:sort:综合策略的排序,1.先使用intro_sort进行排序1.1 intro_sort为快速排序的分块方式,当分块的深度大于阀值时采用堆排对剩下的数据进行排序。1.2 经1.1后的intro_sort排序后,大致上数据处于大部分有序的状态2.然后对1后的大致有序的状态,进行最终的插入排序,因为1后的数据大致是有序的,因此插入排序的实际效率是很高的,不会是O(n^

2017-12-25 12:20:50 148

原创 stl 容器 简略

1.vector:动态连续数组,空间不足时分配,重新分配双倍空间进行存储,数据的插入和删除会导致后续数据的拷贝移动 2.list:双向循环链表,非连续空间 3.map:红黑树,log级别,空间内存消耗O(N)插入:递归两层上升,最多旋转2次,3 case删除:递归1层上升,最多旋转3次, 4 case  4.set:红黑树,log级别,空间内存消耗O...

2017-12-23 15:46:02 170

空空如也

空空如也

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

TA关注的人

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