- 博客(35)
- 资源 (1)
- 收藏
- 关注
原创 Go 与异步 IO - io_uring 的思考
本来准备写一篇详细关于 io_uring 的中文文章,不过在使用上官方的一些文章写的已经非常详细,简单的拿来翻译感觉又失去了乐趣于是便借鉴 liburing,配合 Go 提供的并发机制实现了一个 golang 版本的异步 IO 库 —— iouring-goGolang 中并发 IO 的现状对于 Go 这种本身便是为并发而生的语言来说,使用 io_uring 这种系统级异步接口也不是那么的迫切比如对于文件的读写以及 socket 的操作都会通过 netpoll 来进行优化,当文件/套接字可读可写.
2020-10-22 13:58:49 3466
原创 Golang 深入源码 —— select 与 channel
Golang 通过 select...case 语句实现了对 channel 的多路复用以及非阻塞收发操作本文将着重讲解以下问题:编译器对 select 语句的优化select 如何随机选择 case当多个 case 同时准备好后,select 又会如何选择 case
2020-09-03 15:54:42 11647
原创 Golang 深入源码 —— channel
Don’t communicate by sharing memory, share memory by communicating.不要通过共享内存来通信,而要通过通信来实现内存共享。这句话是 Go 语言设计团队的首任负责人 Rob Pike 对并发编程的建议,也是 Go 的并发哲学,通道 Channel 便是基于这种哲学我们可以把 Channel 看做是一个先进先出(FIFO)的数据队列数据结构type hchan struct { lock mutex qcount.
2020-07-21 15:58:12 42463
原创 WIP: DeltaFIFO
Queue 接口抽象出一个生产者消费者队列,用来解耦对 kubernetes 资源的获取和处理:Reflector 作为生产者,将从 apiserver 中获取到的资源对象存放到 Queue 中Controller 作为消费者,调用 Pop 方法进行消费。Queue 在 Store 接口的基础上又提供了四个方法用于队列的消费type Store interface { Add(obj interface{}) error Update(obj interface{}) error Del
2021-04-16 13:37:52 383
原创 深入 Kubernetes Informer -- Store 与 Indexer
在 Informer 中 Store 提供了将存储对象的能力,而 Indexer 在 Store 的基础上又提供了可以自定义索引来查询对象的功能StoreStore 接口提供的功能比较直观,主要是用于对对象的增删改查。type Store interface { Add(obj interface{}) error Update(obj interface{}) error Delete(obj interface{}) error List() []interface{} ListKeys
2021-03-28 13:02:03 421
原创 深入 kubernetes 的 Wait 工具包
wait 包提供了通过轮询或者监听一个条件的修改(关闭channel, ctx.Done,…)来执行指定函数的工具函数,这些函数可以分为四大类Until 类:根据 channel 的关闭或者 context Done 的信号来结束对指定函数的轮询操作Condition 类:不只是会根据 channel 或者 context 来决定结束轮询,还会判断轮询函数的返回值来决定是否结束Wait 类:Backoff 类:在介绍具体函数前,介绍一下用于对轮询的时间间隔进行抖动干扰的函数 Jitter
2021-03-27 00:20:31 1469 1
原创 镜像构建时使用 ARG 导致镜像缓存失效
工作中发现项目在镜像构建时,即使没有修改 go.mod 也依然会执行 go mod download 来拉取依赖,而不是使用镜像缓存,导致每次构建时间都很长经过排查发现是使用 ARG 导致的镜像缓存失效构建镜像时可以使用 ARG 指令来设置构建环境的环境变量首先在 Dockerfile 中 ARG 指令定义参数名称,设置默认值ARG < name >[=< default value >]docker build 时使用 --build-arg <name>.
2020-11-06 17:59:35 483 4
翻译 【译】高性能异步 IO —— io_uring (Effecient IO with io_uring)
本文的目的是介绍最新的 Linux 异步 IO 接口 io_uring ,并将其与现有产品进行比较。我们将探讨其存在的原因,它的内部工作原理以及开放给用户的接口。本文不会讨论特定命令之类的细节,这些都可以查看相关 man 文档或者 lord of the io_uring,我们会介绍 io_uring 及其工作原理,希望读者可以更深刻的理解。本文和 man 之间会有一些重叠,如果不提供这些细节就无法提供对 io_uring 的描述介绍Linux 中有很多方法可以执行基于文件的 IO,最古老和基本的
2020-10-23 17:09:47 2321
原创 Go Test 总结
golang test 要求我们以 *_test.go 来创建测试文件,注意 以 _ 包括(_test.go) 或者 . 开头的文件都会被忽略测试文件中可以包含 测试函数,基准测试函数, 示例函数测试函数必须以 TestXxx 命名,其中Xxx不能小写字母开头基准测试函数必须以 BenchmarkXxx 命名示例函数必须以 ExampleXxx 命名go build 时,并不会将 *_test.go 文件一起打包编译,所以 *_test.go 中的一些 init 或者全局变量,并不能在执行中访
2020-09-17 16:04:36 2895
原创 Shell 小技巧 eval —— 通过变量获取环境变量
场景系统中存在环境变量 USER=iceber脚本中存在一个变量 env_name=USER需要通过变量 env_name 获取到环境变量 USER 的值错误示例$ # 环境中已存在环境变量 USER$ env_name=USER$ echo ${$env_name}${$env_name}: bad substitution很显然,直接使用 $ 嵌套来获取值是行不通的正确示例$ # 环境中已存在环境变量 USER$ env_name=USER$ eval echo '$'
2020-08-27 16:08:48 21125
原创 SSH 用法进阶 —— 免密登录与端口转发
ssh 是一个非常常用的工具,通常用来登录到远程主机上,不过 ssh 不仅仅只能用来登录,还是进行多种的端口转发基本使用登录到远程主机$ ssh <user>@<remote-ip>ssh 默认连接的端口是 22,如果 ssh server 监听的其他端口的话那么可以使用 -p <port>来指定端口如果使用本地当前用户名登录的话,也可以省略 <user>@,只需要 <remote-ip>即可如何查看 ssh server 监听.
2020-08-20 20:09:26 28911
转载 Linux下tar bz gz等压缩包的压缩和解压
.tar格式解包: $ tar xvf FileName.tar打包 $ tar cvf FileName.tar DirName(注:tar是打包,不是压缩!).gz格式解压1: $ gunzip FileName.gz解压2: $ gzip -d FileName.gz压缩: $ gzip FileName.tar.gz格式解压: $ tar zxvf FileName.tar.gz压缩: $ tar zcvf FileName.tar.gz DirName.bz2格式解压1: $
2020-07-31 17:29:30 44936
原创 编译 Go 程序时加入 git commit 等额外信息
在编译 Go 程序的时候如何加入一些额外的信息,比如 当前最新的 commit sha,编译的 go version 之类的通过 go build -ldflags "-X importpath.name=value’ " 赋值字符串value给指定包importpath中的变量name-ldflags 会将后边的参数传递给 go tool link 链接器go tool link 的 -X 会将字符串赋值给指定包中变量,格式是 importpath.name=value// main.gop.
2020-07-29 13:15:43 21993
原创 grpc 开发进阶 - 失败重试
RPC调用失败情况分析RPC 调用失败可以分为三种情况:RPC 请求还没有离开客户端RPC 请求到达服务器,但是服务器的应用逻辑还没有处理该请求服务器应用逻辑开始处理请求,并且处理失败最后一种情况是通过 server config 配置的重试策略来处理的,是本文主要讲解的内容而对于前两种情况,gRPC 客户端会自动重试,与重试策略的配置并没有太大关系因为这两种情况,服务端的逻辑并没有开始处理请求,所以始终可以重试,也被称为透明重试(transparent retries)对于第一
2020-05-14 18:41:54 26851
原创 Runc 与 Cgroups
Runc 可以算是启动创建容器的最后一步,其中设置 Cgroups,隔离 namespaces,配置网络,挂载相应的卷 等一系列操作本文将主要讲 runc 是如何去操作系统中的 Cgroups,实现对资源的限制和管理的Runc 支持三种方式来限制管理资源,分别是使用 Cgroups V1, Cgroups V2, Systemd本文将主要讲解 Cgroups V1, 关于 Cgroups V1 相关的基本概念可以参考 Linux Cgroups V1 介绍与使用Cgroup ManagerCgr
2020-05-13 15:03:03 14393
原创 Linux Cgroups V1 介绍与使用
简介Cgroups 全称 Control Group,是 Linux 内核提供的物理资源隔离机制,通过这种机制,可以针对一组进程或线程设置资源权重,统计资源使用量,操纵启停等Cgroups 可以限制,记录一组进程或者线程所使用的的物理资源(CPU, Memory, IO 等),是 LXC 实现虚拟化所使用的的资源管理手段本质上来讲,cgroups 是内核附加在程序上的一系列钩子(hook), 通过程序运行时对资源的调度触发相应的钩子已达到资源追踪和限制的目的Cgroups 概念很多文章都写 ta
2020-05-12 13:43:38 16347
原创 grpc 开发进阶 - 传递 metadata
现在网上大部分都是 grpc 相关的介绍,真正涉及到 grpc 的配置使用的文章还是比较少的所以本系列着重介绍 grpc 开发时可以能会用到的一些配置grpc 支持在 server 端和 client 端发送 metedata,一些验证信息之类的可以放在这个里边metadata可以通过 metadata 包来构建type MD map[string][]string一个键可以对应...
2020-04-29 14:59:49 14991
原创 grpc 开发进阶 - 使用拦截器 interceptor
现在网上大部分都是 grpc 相关的介绍,真正涉及到 grpc 的配置使用的文章还是比较少的所以本系列着重介绍 grpc 开发时可以能会用到的一些配置拦截器在作用于每一个 RPC 调用,通常用来做日志,认证,metric 等等interfactor 分为两种unary interceptor 拦截 unary(一元) RPC 调用stream interceptor 处理 stre...
2020-04-28 22:13:38 17365
原创 grpc 开发进阶 - 加密传输
现在网上大部分都是 grpc 相关的介绍,真正涉及到 grpc 的配置使用的文章还是比较少的所以本系列着重介绍 grpc 开发时可以能会用到的一些配置不使用任何加密客户端创建连接的时候默认必须使用加密传输,否则会直接报错2020/04/28 15:59:53 did not connect: grpc: no transport security set (use grpc.WithI...
2020-04-28 16:15:07 16089
原创 grpc 开发进阶 - 使用压缩器 compressor
现在网上大部分都是 grpc 相关的介绍,真正涉及到 grpc 的配置使用的文章还是比较少的所以本系列着重介绍 grpc 开发时可以能会用到的一些配置compressorgrpc 允许用户自定义 compressor 来压缩传输的内容,并且要求在服务端和客户端都注册使用的 compressorgrpc 已经提供了一个 gzip 的压缩器,可以拿来直接使用,如果需要自定义 compres...
2020-04-28 15:31:38 16141
原创 vim - 格式化JSON
为什么需要使用vim格式化json对于json文本,如果没有经过格式化,可读性还是极差的,这时需要格式化或者说是优化 JSON 内容{"a":"b", "c":"d"}格式化为{ "a": "b", "c": "d"}修改 vimrc使用 python json.tool 模块可以直接格式化json" .vimrc" 创建JSON Format 函数fun...
2020-04-24 12:39:37 13500 2
原创 为什么孤儿进程没有被init收养
我们都知道在Linux上孤儿进程和僵尸进程都会被进程号为1的init进程收养,收尸,但这在使用Systemd来管理系统的发行版上比如Ubuntu上就不是那么靠谱了首先我们写一个简单的孤儿进程的例子#include<unistd.h>#include<stdio.h>#include<stdlib.h>int main(void){ switc...
2018-03-15 11:22:13 16624 3
原创 Python 协程和asyncio模块
本文首先对asyncio模块的使用进行简单的介绍,然后着重分析asyncio中关于事件循环和协程的部分,而对于模块中在事件循环创建套接字连接等方法将会在另外的文章介绍简单使用 async def语句或使用@asyncio.coroutine装饰的生成器来实现可以使用asyncio模块的协程 基于生成器的协程应该使用yield from 而不是原始的yield语法imp...
2018-03-07 14:41:14 1652
原创 Python 生成器,协程
生成器generator 生成器可以简单有效的创建庞大的可迭代对象,而不需要在直接在内存中创建存储整个序列 可以使用生成器推导式或者生成器函数来创建生成器 生成器函数返回数据时使用yield语句,而不是使用return>>> def countdown(n):... print("Counting down from %d" %n)....
2018-03-07 14:41:03 928
原创 Python 轻松处理HTTP——Requests库
第三方库Requests 擅长处理那些复杂的HTTP请求,cookie, header等内容,并且支持 Python 2.6—2.7以及3.3—3.7提供了比python2中urllib,urllib2和python3中urllib.request,urllib.repsonse等模块更加简洁方便的API安装Requests库$ pip install requests发送请求Reponse响应对...
2018-03-01 15:35:04 1475
原创 Python 处理HTML/XML——Beautiful Soup4
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.本文为Beautiful Soup属性方法总结,更多例子请查阅官方文档$ pip install beautifulsoup4 #debian或Ubuntu下可以$ apt-get install Python-bs4加载BeautifulSoup库>>> from bs4 im...
2018-02-28 14:51:16 4270 2
原创 Python 异常处理
Python有两种错误,一种是语法错误,一种是异常语法错误也称为解析错误,是在语句或表达式上的语法错误异常是在执行期间检测的错误,可以被捕捉并在程序中处理>>> while True:... try:... x = int(input("Please enter a number: "))... break... excep...
2018-02-26 14:47:33 1366
原创 Python 深浅复制
Python中的赋值语句不复制对象,它们在目标和对象之间创建绑定。对于可变的或包含可变项的容器,有时需要一个副本,所以可以改变一个副本而不改变另一个。浅复制 将创建一个新对象,但它包含的是对原始对象包含的项的引用。a = [] b = list(a)c=a.copy()d = copy.copy(a)深复制 创建一个新对象,并且递归的复制他包含的所有对象。import copy b = [...
2018-02-25 17:25:55 1234
原创 Python 排序
list.sort(key=None, reverse=None )直接修改列表,仅列表定义此方法sorted(iterable[, key][, reverse])为内建函数,可以接收任何可迭代对象,并返回一个排好序的列表key参数用于指定在进行比较之前对每个列表元素调用并返回用于排序目的的值的函数>>> student_tuples = [... ('john', ...
2018-02-25 01:01:22 1147
原创 Python 处理日期时间——Arrow库
Python针对日期时间的处理提供了大量的package,类和方法,但在可用性上来看非常繁琐和麻烦第三方库Arrow提供了一个合理的、人性化的方法来创建、操作、格式转换的日期,时间,和时间戳,帮助我们使用较少的导入和更少的代码来处理日期和时间。$ pip install arrow获取当前时间 arrow.utcnow(), arrow.now()>>> arrow.utc...
2018-02-24 23:00:09 21504
原创 Python基础三——推导式,函数,修饰器
循环外使用else 可用来判断for循环是否正常结束,如果调用break跳出,则会执行elseches = []for che in ches:breakelse:print('no che') 使用zip()并行迭代 通过zip函数对多个进行并行迭代,zip()在最短序列用完就会停止>>> for day,fu...
2018-02-24 17:14:41 992
原创 Python基础二——列表,元组,字典,集合
在使用索引时,太大的索引会导致错误,而用于切片时,超出范围的切片索引会被得当处理>>> a = list('123455')>>> a[1:34]['2', '3', '4', '5', '5']列表list[::-1] 可直接实现列表逆序list.append() 可将元素添加到尾部list1.extend(list2) ...
2018-02-24 16:20:35 847
原创 Python基础一——字符串
默认情况下,Python源文件被视为以UTF-8编码 可以指定为源文件指定不同编码 在#!行后增加一个特殊注释行定义文件的编码 # -*- coding: encoding -*- # -*- coding: cp-1252 -*- 特殊编码注释必须在文件中的第一行或第二行中python变量仅仅是一个名字,赋值操...
2018-02-24 15:45:02 749
原创 Python itertools模块
itertools模块包含创建高效迭代器的函数,这些函数的返回值不是list,而是iterator(可迭代对象),可以用各种方式对数据执行循环操作count(), repeat(), cycle(), chain(), chain.from_iterable(), islice()compress(), filterflase(), dropwhile()...
2018-02-23 23:00:34 655
原创 Windows 下 Apache2 Django配置(针对找不到mod_wsgi.so)
Windows下apache2 django配置以及没有mod_wsgi.so问题
2017-10-18 20:02:53 2142
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人