Golang 的启动过程分析

发表时间:2017-09-30 09:49:32

系统环境

系统版本: Fedora Release 25
内核版本:4.12.8-200.fc25.x86_64
GO: 1.8.3 linux/amd64

从二进制中查找 Entry Point

首先编译一个 go 的二进制程序(此处我编译的是 golang/dep 项目),然后使用 objdump 或者 readelf 取得程序的入口地址:

1 2 3 4 5 6
$ objdump -f dep dep: file format elf64-x86-64 architecture: i386:x86-64, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED start address 0x0000000000457690

Golang runtime.getg() 的实现

发表时间:2017-09-30 09:28:18

系统环境

系统版本: Fedora Release 25
内核版本:4.12.8-200.fc25.x86_64
GO: 1.8.3 linux/amd64

runtime.getg()

这个函数用于获取当前正在执行的 goroutine 的信息(/usr/local/go/src/runtime/stubs.go#21)。

1 2 3 4
// getg returns the pointer to the current g. // The compiler rewrites calls to this function into instructions // that fetch the g directly (from TLS or from the dedicated register). func getg() *g

使用 QEMU 和 GDB 调试 Linux 内核 v4.12

发表时间:2017-07-02 02:26:06

系统环境

系统版本: Fedora Release 25
内核版本:4.8.6-300-fc25.x86_64
QEMU:2.7.1-6.fc25
GDB:7.12-24.fc25
GCC: 6.2.1
MAKE: 4.1

编译内核

内核下载地址(目前最新版本为:v4.12-rc7):

1 2
git clone https://github.com/torvalds/linux.git cd ./linux

Golang 中不使用分代和紧凑型 GC 的原因

发表时间:2017-05-18 02:52:19

来源:Why golang garbage-collector not implement Generational and Compact gc

紧凑型 GC 拥有如下优点:

  1. 解决内存碎片问题
  2. 可以使用简单高效的碰撞分配器(Bump Allocator)

但是现代的内存分配算法(比如 Go Runtime 使用的基于 tcmalloc 的内存分配算法)已经不存在内存碎片问题。而且碰撞分配器在单线程环境下可以做到简单高效,但是在多线程环境下需要使用锁机制进行同步。当然,也可以为每个线程准备一个可分配的内存缓存,这样在每个线程中使用内存缓存来分配内存,避免锁的性能问题。不过这样做这个碰撞分配器就会变得复杂。
因此可以说在多线程环境下,使用紧凑型 GC 并不会带来实质性的性能提升。当然这并不是说使用紧凑型 GC 会有什么问题。

然后是分代 GC:
分代 GC 依赖一个基本的假设:大部分对象(或其他数据结构)只使用一小段时间就不再被使用了,因此 GC 应该花费更多的时间或性能在最新创建的对象上,而不是频繁的检查所有的对象。

在 Centos 中编译 openwrt 固件

发表时间:2017-02-18 03:09:23

编译环境

系统版本:CentOS Linux release 7.3.1611 (Core)
内核版本:3.10.0-514.2.2.el7.x86_64

注意事项:整个过程需要在非 root 用户环境下进行。同时在编译过程中需要下载大量内容,如果网络不畅,则需要使用http/https代理。

安装编译过程必须的软件:

1 2
sudo yum install epel-release sudo yum install subversion binutils bzip2 gcc gcc-c++ gawk gettext flex ncurses-devel zlib-devel zlib-static make patch unzip perl-ExtUtils-MakeMaker glibc glibc-devel glibc-static quilt ncurses-libs sed sdcc intltool sharutils bison wget git-core openssl-devel xz

使用 socat 和 kcptun 实现 vpn

发表时间:2017-01-14 07:19:45

工具简介

socat 是一个流重定向工具,例如可以将一个文件流通过 tcp 发送出去。本文主要使用 socat 的 tun 转发功能。
socat 可以使用如下命令安装:

1
yum install -y socat

kcptun 是一个使用 udp 代替 tcp 的数据承载工具。在较差的网络环境中可以用带宽换时延,提高网络速度。
kcptun 是一个基于 kcp 协议的开源 tunnel 项目,可以在 Github 下载,注意选择系统版本 。

工作原理

使用 Docker 搭建 Keepalived 高可用集群

发表时间:2016-12-26 09:25:05

KeepAlived 镜像构建

Dockerfile 文件如下:

1 2 3 4 5 6 7 8 9 10 11 12
FROM debian:jessie RUN apt-get update &&\ apt-get install -y keepalived ADD ./entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh ENTRYPOINT /entrypoint.sh CMD keepalived -l -n -D

entrypoint.sh 启动脚本:

1 2 3 4
#!/bin/bash set -e exec "$@"

vim 命令

发表时间:2016-12-09 08:59:24

移动命令:

  • h j k l:左 下 上 右
  • w:移动到下一个单词的第一个字符
  • e:如果光标当前在单词最后一个字符,移动到下一个单词的最后一个字符,否则移动到当前单词最后一个字符
  • b:如果光标当前在单词第一个字符,移动到上一个单词的第一个字符,否则移动到当前单词第一个字符
  • ge:移动到上一个单词的最后一个字符
  • ^:移动到行首第一个不为空的字符
  • 0:移动到行首
  • $:移动到行尾
1 2 3
移动命令前可以加一个非0(数字0具有特定功能)的数字(^前加数字无效),表示执行几次,不加数字等价于数字1。 w e b ge:单词的概念是指以非文字字符分隔的部分,例如 xxx-sss sssdd 视为三个单词。 W E B gE:功能与 w e b ge 一致,但是单词的概念是指以空格分隔的部分,例如 xxx-sss sssdd 视为两个单词。

跳转命令:

  • %:跳转到匹配的括号
  • G:跳转到文件最后一行
  • gg:跳转到文件第一行
  • 数字+G:跳转到数字指定行
  • CTRL+g:显示光标位置

Centos7 搭建 L2TP+ IPsec VPN

发表时间:2016-12-03 03:44:35

软件说明:

  • ppp:提供用户名密码验证功能,实现VPN的用户账号密码验证
  • libreswan:提供IPsec功能,加密IP数据包
  • xl2tpd:提供VPN功能,依赖于ppp和libreswan

系统环境:

  • Centos 7
  • Linux 3.10.0-327.36.3.el7.x86_64
  • ppp 2.4.5(系统自带,不需要额外安装)
  • libreswan 3.15(需要安装)
  • xl2tpd 1.3.6(需要安装)
1
yum install -y libreswan xl2tpd

Helm Chart 结构

发表时间:2016-11-24 12:03:37

Chart 目录结构

1 2 3 4 5 6 7 8 9
examples/ Chart.yaml # Yaml文件,用于描述Chart的基本信息,包括名称版本等 LICENSE # [可选] 协议 README.md # [可选] 当前Chart的介绍 values.yaml # Chart的默认配置文件 requirements.yaml # [可选] 用于存放当前Chart依赖的其它Chart的说明文件 charts/ # [可选]: 该目录中放置当前Chart依赖的其它Chart templates/ # [可选]: 部署文件模版目录,模版使用的值来自values.yaml和由Tiller提供的值 templates/NOTES.txt # [可选]: 放置Chart的使用指南

Chart.yaml 文件

1 2 3 4 5 6 7 8 9 10 11 12 13
name: [必须] Chart的名称 version: [必须] Chart的版本号,版本号必须符合 SemVer 2http://semver.org/ description: [可选] Chart的简要描述 keywords: - [可选] 关键字列表 home: [可选] 项目地址 sources: - [可选] 当前Chart的下载地址列表 maintainers: # [可选] - name: [必须] 名字 email: [可选] 邮箱 engine: gotpl # [可选] 模版引擎,默认值是gotpl icon: [可选] 一个SVGPNG格式的图片地址

requirements.yaml 和 charts目录