Yifei Kong

Feb 17, 2019

Rust 的生命周期管理概述

周末花些时间把 Rust 生命周期又翻了一遍,终于能写出一个可以编译通过的程序了😁。Rust 虽然学习曲线比较陡峭,但是掌握之后就发现这么设计确实是有道理的,尤其是对于编写正确的 C++ 程序也很有帮助。

可变与不可变

Rust 中使用 let 来绑定一个变量,默认是不可变的。也就是说默认就相当于 C++ 中 const 变量。但是实际上 C++ 中的 const 也只是只读而已。

let x = 5;
x = 6;  // 非法

如果想要更改一个变量的值,在声明的时候,应该加上 mut(每次写 let mut 的时候,我心里都是读作“让TM的”)

let mut = 5;
x = 6

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

kubernetes 初探——在 Master 节点部署 Pod

虽然 K8S 本身不建议在 Master 节点中部署 Pod,但是实际上也是可以的。

kubectl taint nodes --all node-role.kubernetes.io/master-

这行命令的意思是移除所有节点的 master taint,这样就可以在 master 节点部署 pod 啦~

原理解释——taint 和 toleration

  1. https://www.ibm.com/support/knowledgecenter/en/SSCKRH_1.0.1/platform/install_pod_scheduling.html
  2. 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

GitHub 上的顶级项目都是做什么的?(一)

前一阵看到同事在用一个名叫 AirFlow 的工具,而我竟然素未耳闻,一番搜索之后发现这个工具是 Apache 的顶级项目,而且在 GitHub 上有 1w+ 的 Star。震惊之余,感觉有必要把 GitHub 上常用工具捋一遍,以避免以后发生重复造轮子的情况。计划是把 GitHub 上 5k+ Star 的项目都知道是做什么用的,每周看 50 个,数据来源是这里:https://gitstar-ranking.com/repositories。

下面是本周的记录:

教程资源类

  1. freeCodeCamp/freeCodeCamp 292180

    免费代码训练营

  2. EbookFoundation / free-programming-books 114236

    免费编程图书

  3. sindresorhus / awesome

    awesome 列表的列表。这个项目起源于某个人做了一个 awesome-php 的 php …

Jan 18, 2019

Dec 28, 2018

使用 cProfile 和火焰图调优 Python 程序性能

本来想坐下来写篇 2018 年的总结,仔细想想这一年发生的事情太多了,还是写篇技术文章吧。

前几天调试程序,发现 QPS 总是卡在 20 左右上不去。开始以为是 IO 问题,就多开了些并发,然并卵,这才想到可能是 CPU 的问题。看了看监控,发现程序某一步的延迟在 400ms 左右,而且这一步是 CPU 密集的。当时开了 4 台双核的机器:(1s / 400ms) * 2 * 4 = 20 啊。看来需要优化下这一步的代码了,那么第一步就是找到可以优化的地方。

测量程序的性能之前并没有实际做过,Google 了一番,感觉标准库的 cProfile 似乎值得一试。

要测量的代码逻辑也很简单,使用 lxml 解析 HTML,然后提取一些字段出来,这些基本都是调用的 …

Nov 22, 2018

使用 Nomad 编排服务

2019-01-02 更新:相对于 Kubernetes 来说,Nomad 还是太简陋了,弃坑

Nomad 是 HashiCorp 出品的一个容器编排服务,相较于重量级的 Kubernetes 来说,Nomad 的特点在于

  1. 轻量级,只有一个二进制文件。K8s 的安装可能就要花上半天,在国内还有万恶的防火墙问题。
  2. 概念也比较清晰,专注于任务的调度的编排,而不像 Kubernetes 一样引入了各种五花八门的概念。
  3. 除了编排容器之外,Nomad 还可以直接编排普通应用,使用 cgroups 安全运行应用。

安装

从官网下载二进制文件,复制到 /usr/local/bin 就好了,不再赘述

使用

$ sudo nomad agent -dev

$ nomad node status
ID …

Nov 21, 2018

Python Redis 客户端连接池解析

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 格式解析

HAR(HTTP Archive) 文件是一种常见的用来保存 HTTP 请求和响应的格式。本质上,HAR 文件其实就是一个 JSON 文件。

每一个 HAR Entry 都可以有以下记录存在:

  • log
  • creator
  • browser
  • pages
    • pageTimings
  • entries
    • request
      • queryString
      • postData
      • params
    • response
      • cookies
      • headers
      • content
    • cache
    • timings

log

这个是一个 HAR 文件的根字段,其他字段都是该字段的子字段

{
    "log": {
        "version" : "1.2",
        "creator" : {},
        "browser" : {},
        "pages": [],
        "entries": [],
        "comment": ""
    }
}

creator

"creator": {
    "name": "Firebug",
    "version …
Next → Page 1 of 30