Feb 17, 2019
周末花些时间把 Rust 生命周期又翻了一遍,终于能写出一个可以编译通过的程序了😁。Rust 虽然学习曲线比较陡峭,但是掌握之后就发现这么设计确实是有道理的,尤其是对于编写正确的 C++ 程序也很有帮助。
可变与不可变
Rust 中使用 let 来绑定一个变量,默认是不可变的。也就是说默认就相当于 C++ 中 const 变量。但是实际上 C++ 中的 const 也只是只读而已。
如果想要更改一个变量的值,在声明的时候,应该加上 mut(每次写 let mut 的时候,我心里都是读作“让TM的”)
copy 和 move …
Feb 16, 2019
昨天想用 iPad 上的 GoodReader 看一本书,但是从 iCloud 同步的时候出了些问题,进度始终为零。由于国内糟糕的网络环境,这种同步失败的问题时有发生。虽然可以直接通过 WiFi 把书从电脑上传过来,但是因为偶尔需要在另一个 iPad 上查看,为了同步进度,还是最终决定还是自己搭建一套云存储设施。
ftp 与 webdav
ftp 协议有诸多问题,现在用的已经很少了。WebDav 协议基于 HTTP,相比 FTP 有不少有点,可以参见文章1。另外不少开源的网盘客户端也支持 webdav。NextCloud 支持 webdav,后面会讲到
sftp 和 sshfs
sftp 则和 ftp 是完全独立的两个东西,虽然最终目的是一样的。好比海豚和鲨鱼都是在海里的生物,但是一个是哺乳动物,而一个是鱼类。sftp …
Feb 12, 2019
虽然 K8S 本身不建议在 Master 节点中部署 Pod,但是实际上也是可以的。
kubectl taint nodes --all node-role.kubernetes.io/master-
这行命令的意思是移除所有节点的 master taint,这样就可以在 master 节点部署 pod 啦~
原理解释——taint 和 toleration
- https://www.ibm.com/support/knowledgecenter/en/SSCKRH_1.0.1/platform/install_pod_scheduling.html
- https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
Jan 25, 2019
Case 1:
CPU 和内存都被打满了,同时发现硬盘 IO 也很高。
ps -eo pid,ppid,cmd,%mem,mem,%cpu --sort=-%mem | head -n 50
发现 kswapd0 偶尔会占用很高的 CPU,而这个进程是在内存满的时候负责在内存和 swap 之间交换。也就是问题的根源是内存满了,而 kswapd0 开始在内存和 swap 之间反复读写文件,导致 CPU 和 IO 也涨了起来,这时候应该找到内存暴涨的根源,进而解决问题。
[1] https://askubuntu.com/questions/259739/kswapd0-is-taking-a-lot-of-cpu
Jan 25, 2019
前一阵看到同事在用一个名叫 AirFlow 的工具,而我竟然素未耳闻,一番搜索之后发现这个工具是 Apache 的顶级项目,而且在 GitHub 上有 1w+ 的 Star。震惊之余,感觉有必要把 GitHub 上常用工具捋一遍,以避免以后发生重复造轮子的情况。计划是把 GitHub 上 5k+ Star 的项目都知道是做什么用的,每周看 50 个,数据来源是这里:https://gitstar-ranking.com/repositories。
下面是本周的记录:
教程资源类
-
freeCodeCamp/freeCodeCamp 292180
免费代码训练营
-
EbookFoundation / free-programming-books 114236
免费编程图书
-
sindresorhus / awesome
awesome 列表的列表。这个项目起源于某个人做了一个 awesome-php 的 php …
Jan 18, 2019
服务治理有两种方式:
- 一种是直接在服务中集成熔断降级等操作
- 一种是使用 sidecar 模式,有公共组件来处理
两种模式的区别如图:
参考资料
- Service Mesh 的本质、价值和应用探索
- Istio, K8S 的微服务支持
- 微服务之熔断、降级、限流
- 微服务化之服务拆分与服务发现
Dec 28, 2018
本来想坐下来写篇 2018 年的总结,仔细想想这一年发生的事情太多了,还是写篇技术文章吧。
前几天调试程序,发现 QPS 总是卡在 20 左右上不去。开始以为是 IO 问题,就多开了些并发,然并卵,这才想到可能是 CPU 的问题。看了看监控,发现程序某一步的延迟在 400ms 左右,而且这一步是 CPU 密集的。当时开了 4 台双核的机器:(1s / 400ms) * 2 * 4 = 20 啊。看来需要优化下这一步的代码了,那么第一步就是找到可以优化的地方。
测量程序的性能之前并没有实际做过,Google 了一番,感觉标准库的 cProfile 似乎值得一试。
要测量的代码逻辑也很简单,使用 lxml 解析 HTML,然后提取一些字段出来,这些基本都是调用的 …
Nov 22, 2018
2019-01-02 更新:相对于 Kubernetes 来说,Nomad 还是太简陋了,弃坑
Nomad 是 HashiCorp 出品的一个容器编排服务,相较于重量级的 Kubernetes 来说,Nomad 的特点在于
- 轻量级,只有一个二进制文件。K8s 的安装可能就要花上半天,在国内还有万恶的防火墙问题。
- 概念也比较清晰,专注于任务的调度的编排,而不像 Kubernetes 一样引入了各种五花八门的概念。
- 除了编排容器之外,Nomad 还可以直接编排普通应用,使用 cgroups 安全运行应用。
安装
从官网下载二进制文件,复制到 /usr/local/bin 就好了,不再赘述
使用
$ sudo nomad agent -dev
$ nomad node status
ID …
Nov 21, 2018
Python Redis 的客户端使用了链接池机制,通过复用链接可以减低服务器的压力并在失败时重试。连接池其实是一种很通用的机制,在实现客户端是是一个经常需要(或许其实不需要)重复发明的轮子。
Redis 客户端一共涉及到了三个类:
- Connection,表示一个到服务器的链接
- ConnectionPool,链接池
- Redis,使用连接池,并在失败时重试
Connection 类解析
Connection 类主要负责建立和 Redis 服务器的一个 Socket 链接,并且沟通相关信息。下面的代码是 Connection 类和 socket 处理相关的代码。
class Connection(object):
def __del__(self):
try:
self.disconnect()
except Exception:
pass
def connect(self):
"""
连接 Redis 服务器
"""
if …
Nov 15, 2018
HAR(HTTP Archive) 文件是一种常见的用来保存 HTTP 请求和响应的格式。本质上,HAR 文件其实就是一个 JSON 文件。
每一个 HAR Entry 都可以有以下记录存在:
- log
- creator
- browser
- pages
- entries
- request
- queryString
- postData
- params
- response
- cache
- timings
log
这个是一个 HAR 文件的根字段,其他字段都是该字段的子字段
{
"log": {
"version" : "1.2",
"creator" : {},
"browser" : {},
"pages": [],
"entries": [],
"comment": ""
}
}
creator
"creator": {
"name": "Firebug",
"version …