A kernel debugger in Python: drgn

原文链接:

2023-08-01 · 1 min · 28 words · Garlic Space

Emiller’s Advanced Topics In Nginx Module Development

原文链接

2023-03-30 · 10 min · 2008 words · Garlic Space

Emiller’s Guide To Nginx Module Development

原文链接:https://www.evanmiller.org/nginx-modules-guide.html 要充分理解网络服务器 Nginx,有助于理解漫画人物蝙蝠侠。 蝙蝠侠很快。 Nginx 很快。蝙蝠侠打击犯罪。 Nginx 与浪费的 CPU 周期和内存泄漏作斗争。蝙蝠侠在压力下表现出色。就 Nginx 而言,它在服务器负载很重的情况下表现出色。 但如果没有蝙蝠侠实用腰带,蝙蝠侠几乎什么都不是。 ...

2023-03-05 · 17 min · 3508 words · Garlic Space

Why does calloc exist?

 原文链接:https://vorpus.org/blog/why-does-calloc-exist/ ...

2023-01-29 · 4 min · 687 words · Garlic Space

Nginx Development guide

这篇文章来自nginx document /http://nginx.org/en/docs/dev/development_guide.html nginx的开发指南 ...

2022-11-15 · 77 min · 16248 words · Garlic Space

Debugging NGINX

这篇文章来自nginx document

2022-05-01 · 2 min · 329 words · Garlic Space

Message-Based Load Balancing

最近工作中涉及到一些负载均衡一些知识这里今天这篇文章是F5的 Message-Based Load Balancing。 这是2009年发布的一篇文章,后续F5已经建议从MBLB迁移到MRP功能模块。 原文链接: https://www.f5.com/services/resources/white-papers/message-based-load-balancing Migrating MBLB Functionality to MRPF Functionality https://techdocs.f5.com/kb/en-us/products/big-ip_ltm/manuals/product/bigip-mblb-to-mrf-migration-12-0-0/2.html 在高可用可扩展性应用场景中,经常能看到负载均衡身影,有硬件设备也有软件实现,由于Web应用广泛应用负载平衡也变得更加适用于HTTP这些协议。 与HTTP不同也会有一些异步的协议:Diameter,RADIUS and SIP,由于大多数负载的设计针对同步消息传输环境,这使得原有的负载难以分发这些协议。 文中主要提到SIP协议的复杂性,SIP是一种基于文本的协议,它的语法和消息非常类似于HTTP协议,不同之处在于SIP不仅可以用TCP,也可以用UDP封装, 对移动业务支持比较好。 如果举一个更好理解的例子, 由于在金融机构工作,一些系统使用长连接异步的通讯方式,比如银联CUPS系统卡接口, 使用的是异步长链接模式,如何做到在前端接入和后端系统均为长连接情况下做到,报文级别的负载? 挑战 Asynchronous Messaging 异步消息 下面是同步场景,客户端发送一个请求同步等待一个响应。 下面是异步场景,客户端发送n个请求,服务端返回n个响应。 这种场景下没有明显的客户端服务端之分,可以看到右边的服务也可能主动发起请求到左边的服务。 Long-Lived Sessions 长连接 在传统负载中,每次会话或连接基础上完成。在同一会话中收到的所有请求都是相同服务器的负载平衡。当通信完成时,会话终止。 长连接场景中导致流量无法均匀分配到指定服务上。 Message-Oriented Communication 消息处理 传统负载均衡维护请求和服务器端连接之间的1:1关系, 针对这种异步长连接场景,就需要做到1:n。也就是需要将请求均匀发送到后端的服务上。这时候就需要区分服务边界,需要多报文进行标识处理。 这里文档中提到AVP, 对AVP的理解,就是报文的标识,也就是需要从报文中找到唯一能标识他的信息。 解决方案 也就是MBLB (Message-Based Load Balancing)。 MBLB使Big-IP LTM能够以交钥匙方式实现特定协议支持,同时仍通过iRules实现客户和环境特定的自定义。 可以看到他提取A报文中的AVP代码根据负载策略送到上面服务器, 提起B报文的AVP送到下面服务器。 总结 F5 TMOS架构提供了F5能够快速实现基于消息的协议, 保持通过iRules翻遍实现了各位异步并进行双向通信的协议适配。 参考及引用 文中图片来自原文 封面图片from 陳丁光

2022-04-01 · 1 min · 59 words · Garlic Space

What every programmer should know about memory,Part 1

这篇文章 What every programmer should know about memory, Part 1 是出自lwn.net 作者 Ulrich Drepper 总线结构 常见的商用计算机结构: 北桥南桥结构: CPU通过FSB连接到北桥, 北桥包含内存控制器,通过不同内存控制器链接不同的RAM,如DRAM,SDRAM, Rambus,南桥主要连接I/O设备,支持不同总线接口如:PCI,SATA,USB。 特点: cpu到cpu之间数据要过北桥 所有设备与RAM需要通过北桥 RAM仅一个端口 通过南桥链接设备与cpu通讯需要经过北桥 瓶颈; 北桥处理能力成为瓶颈。 设备与内存: 北桥与内存 早些年设备间通讯需要通过cpu, 为了减少CPU压力,出现DMA,虽然减少cpu压力,但是占用北桥带宽。 为了增强北桥内存访问能力,有些系统支持北桥连接外部更多的内存控制器: 北桥连接外部内存控制器南北桥结构 特点: 增强北桥处理能力 瓶颈: 内部带宽 北桥成为中心关键节点,内存控制器接入越多 另外一种解决方法是将外部控制器集成到CPU中( NUMA) 将内存控制器集成到cpu中,不同cpu连接不同内存, 没有北桥瓶颈,但当访问链接到其他CPU的内存时使得访问变得复杂。 NUMA - Non-Uniform Memory Architecture RAM类型 Static RAM 需要多个晶体管,文章中提到有6个或4个的。 单元状态稳定,不需要刷新周期。 断电后数据丢失 Dynamic RAM 需要一个晶体管和一个电容 需要刷新不断刷新 DRAM 访问 如果要访问一个4G地址, 4GB的RAM需要2^32个地址线, 使用二进制编码,N 个地址线可以完成 2_N_ 个地址,使用N个地址线,除了电路设计复杂之外需要大量的芯片,DRAM设计时使用矩阵方式,将一维的操作转化为二维操作。使用行地址选择器和列地址选择器方式。简化了电路的设计。仅需要很少地址线,为了能区分行或列需要额外的一些lines。 总结: 处于成本考虑内存大多使用DRAM 需要单独选择存储单元才能使用 由于性价比考虑选择DRAM地址线设计使用矩阵方式。 在读取或写入操作的可用之前由于电器特性需要一段时间 ...

2021-10-16 · 1 min · 143 words · Garlic Space

Effective Go-5

Do not communication by sharing memory; instead,share memory by communicating

2021-04-27 · 11 min · 2281 words · Garlic Space

Effective Go-4

Interfaces and other types Interface Sequence这个例子,调用sort package中的方法,对于集合要实现sort的接口:Len(), Less(i,j int) bool 和 Swap(i,j int)。Sequence同时通过String()对集合内容进行格式化。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 package sequence_test import ( "fmt" "sort" "testing" ) type Sequence []int func (s Sequence) Len() int { return len(s) } func (s Sequence) Less(i, j int) bool { return s[i] < s[j] } func (s Sequence) Swap(i, j int) { s[i], s[j] = s[j], s[i] } func (s Sequence) Copy() Sequence { copy := make(Sequence, 0, len(s)) return append(copy, s...) } func (s Sequence) String() string { s = s.Copy() sort.Sort(s) str := "[" for i, elem := range s { if i > 0 { str += " " } str += fmt.Sprint(elem) } return str + "]" } func (s Sequence) Stringsprint() string { s = s.Copy() sort.Sort(s) return fmt.Sprint(s) } func (s Sequence) StringIntSlice() string { s = s.Copy() sort.IntSlice(s).Sort() return fmt.Sprint(s) } func TestSequence(t *testing.T) { var s Sequence = Sequence{100, 12, 83, 34, 59, 86} t.Logf("%#v", s) t.Log(s) t.Log(s.String()) t.Log(s.Stringsprint()) t.Log(s.StringIntSlice()) } 1 2 3 4 5 6 7 8 9 === RUN TestSequence f:\GO\go_test\sequence\sequence_test.go:54: sequence_test.Sequence{100, 12, 83, 34, 59, 86} f:\GO\go_test\sequence\sequence_test.go:55: [12 34 59 83 86 100] f:\GO\go_test\sequence\sequence_test.go:56: [12 34 59 83 86 100] f:\GO\go_test\sequence\sequence_test.go:57: [12 34 59 83 86 100] f:\GO\go_test\sequence\sequence_test.go:58: [12 34 59 83 86 100] --- PASS: TestSequence (0.00s) PASS ok loop/sequence 1.996s 类型转换 String()接口通过 “for i, elem := range”方式实现,也可以像Stringsprint直接调用fmt.Sprint处理实现。 ...

2021-04-19 · 5 min · 1046 words · Garlic Space