0%

什么是内存对齐

用一个例子带出这个问题,看下面的小程序 。理论上,64位系统下,int占4byte,char占一个byte,那么将它们放到一个结构体中应该占4+1=5byte;但是实际上,通过运行程序得到的结果是8 byte,这就是内存对齐所导致的。

阅读全文 »

内存对齐后,可以达到更高的性能。但背后的原理是什么呢?本文从内存的物理组成方式,和读取原理上进行说明。

阅读全文 »

1 cpu cache的介绍

cpu cache(高速缓存)分为三类:L1 cache、L2 cache和L3 cache。

其中:

  • L1 cache分成两种,一种是指令缓存,一种是数据缓存。L2 cache和L3 cache不分指令和数据。
  • L1 cache和L2 cache在每一个CPU核中,L3 cache则是所有CPU核心共享。
  • L1、L2、L3的越离CPU近就越小,速度也越快,越离CPU远,速度也越慢。
    阅读全文 »

IO模型

一个IO输入操作通常包括2个阶段:

  1. 等待数据准备好;
  2. 从内核向进程复制数据。

对于网络IO模型,这2步分别是:

  1. 等待数据从网络到达。当所等待分组到达时,它被复制到内核中的某个缓冲区;
  2. 把数据从内核缓冲区复制到应用进程缓冲区。
阅读全文 »

问题

线上有个用C++写的b服务,随着运行时间的增减,占用内存也会不断增加,最终kernel会触发OOM,导致服务不可用。

所使用的物理机内存为160GB,以上图中一个broker进程就占了大约6.6GB的内存,运行了10天后内存还在持续增长,存在内存泄漏的问题。

阅读全文 »

熟悉golang的同学,一定很熟悉用pprof来作为性能分析和可视化的工具,包括 cpu profile, memery profile等。这么方便且炫的功能,在C++里也一样能实现。所需要的工具就是gperftools。

阅读全文 »

map不是并发安全的

官方的faq里有说明,考虑到有性能损失,map没有设计成原子操作,在并发读写时会有问题。

Map access is unsafe only when updates are occurring. As long as all goroutines are only reading—looking up elements in the map, including iterating through it using a for range loop—and not changing the map by assigning to elements or doing deletions, it is safe for them to access the map concurrently without synchronization.

阅读全文 »

当了解一些大型项目的代码逻辑时,如kubernetes,跟着调试器跟踪代码学习,是很好的方式。当项目部署在远程环境时,在本机进行开发,很自然对Remote Debug有迫切需求,这也是和调试一般golang程序最主要的诉求区别点,本文将通过两个实际例子,来介绍如何Remote Debug。

阅读全文 »