File tree 4 files changed +59
-1
lines changed
4 files changed +59
-1
lines changed Original file line number Diff line number Diff line change 16
16
17
17
假如使用了 SQL 数据库,那么可以从数据库中提取表结构,生成对应的结构体定义,也可以生成 IDL 再进一步转译。
18
18
19
+ ### 项目重构
20
+
21
+ 在面临大规模的 API 变动以及项目重构等情况,可以使用代码分析工具先对源代码进行分析,然后做一定变换再输出。
22
+
19
23
## 节约重复劳动
20
24
21
25
有时候有一些代码需要有大块的包装函数,这时候使用宏会非常复杂,难以调试;或者是需要跨越多个文件添加代码,例如添加了一个 API,需要对应地添加处理器等;或者是需要生成一些模板没有能力生成的部分,例如生成函数签名等;有的时候生成代码有大量条件判断来生成不同的代码,这时候使用模板就不太灵活。
Original file line number Diff line number Diff line change
1
+ ## 对特定线程打印断点
2
+
3
+ 在 gdb 中,默认打断点会应用到全部线程上,这时候如果多个线程同时执行了同样的代码,那么断点就会在不同线程来回切换,不方便跟踪。gdb 可以使用 ` break xxx thread yyy ` 的语法,只对某个线程打断点[ ^ 1 ] 。
4
+
5
+ ## 参考资料
6
+
7
+ [ ^ 1 ] : [ https://sourceware.org/gdb/onlinedocs/gdb/Thread_002dSpecific-Breakpoints.html ] ( https://sourceware.org/gdb/onlinedocs/gdb/Thread_002dSpecific-Breakpoints.html )
Original file line number Diff line number Diff line change @@ -16,4 +16,41 @@ Linux 没有规定程序以及配置必须安装在哪个目录下,但为了
16
16
17
17
配置文件一般有全局的配置文件,也有用户的配置文件。通常而言,全局配置文件由系统管理员管理,存放在 ` /etc ` 目录下。例如,` nginx ` 程序的配置文件就存放在 ` /etc/nginx ` 目录下。而用户特定的配置文件,一般可以存放在 ` ~/.config ` 目录下,或者 ` ~/.$APP ` 目录下,例如,如果你写了一个服务器程序叫 ` my-server ` ,可以将配置文件放到 ` ~/.my-server ` 中。
18
18
19
- 不同的程序对于配置文件的搜索过程不一样,有的程序会内置若干个搜索路径,并按照优先级依次覆盖配置,有的程序必须手动指定一个配置文件路径,或者使用默认的配置文件路径启动。
19
+ 不同的程序对于配置文件的搜索过程不一样,有的程序会内置若干个搜索路径,并按照优先级依次覆盖配置,有的程序必须手动指定一个配置文件路径,或者使用默认的配置文件路径启动。
20
+
21
+ ## 编写 Unit 文件
22
+
23
+ 通过 systemd 服务,我们可以让程序开机自启,并在崩溃退出的时候由系统自动重新启动。一般来说,我们需要在配置文件中指定:
24
+
25
+ - 服务的信息
26
+ - 服务的依赖
27
+ - 启停命令
28
+ - 运行环境
29
+
30
+ 要创建一个 Unit,我们可以使用命令 ` systemctl edit --full --force --user my-server.service ` 来创建并编辑一个 Unit 文件。
31
+
32
+ 在编辑器中,按照以下模板编写内容:
33
+
34
+ === "my-server.service"
35
+ ```ini
36
+ [ Unit]
37
+ Description=my-server
38
+
39
+ [Service]
40
+ WorkingDirectory=/home/my-server
41
+ Type=simple
42
+ Environment=LOGLEVEL=info
43
+ Environment=SECRET_KEY=secret
44
+ ExecStart=/home/my-server/bin/my-server --port=8080
45
+ Restart=on-failure
46
+ User=my-server
47
+ Group=my-server
48
+ LimitCORE=infinity
49
+
50
+ [Install]
51
+ WantedBy=multi-user.target
52
+ ```
53
+
54
+ 其中 ` ExecStart ` 表示程序启动的命令,` WorkingDirectory ` 表示程序运行的时候的工作目录,而 ` Environment ` 则表示程序运行时的环境变量。
55
+
56
+ 保存退出编辑器之后,systemd 就会将文件内容放到合适的地方。这时候还不能自动启动程序,还需要执行 ` systemctl --user enable my-server ` 将程序加入到开机启动的列表中,然后执行 ` systemctl --user start my-server ` 将程序启动。我们还可以通过 ` systemctl --user status my-server ` 来查看程序运行的状态,通过 ` journalctl --user -u my-server ` 可以看到程序的标准输出内容。
Original file line number Diff line number Diff line change @@ -39,6 +39,16 @@ vector<RangeInfo> ranges;
39
39
40
40
## 计算存储分离
41
41
42
+
43
+
44
+ ## 计算存储耦合
45
+
46
+ 由于计算存储分离之后数据的存取需要通过网络进行,而常见的以太网络所能提供的带宽有限,而且一旦计算服务器与存储服务器物理距离变大,那么数据存取的延迟也会上升。为了节省带宽以及减少延迟,可以采取将计算程序尽可能靠近存储程序的策略。一个很常见的例子就是,我们在使用 SQL 数据库的时候,既可以使用简单的 SQL 语句将大量数据发送到应用程序再进行计算,也可以编写一些复杂的 SQL,将计算交给数据库本身去做。
47
+
48
+ 一些分布式数据库例如 TiDB,尽管采取了计算节点与存储节点分离的设计,但 TiKV 本身仍有 Coprocessor 功能,也可以承担一部分的计算任务。
49
+
50
+ 当然,当计算量上升的时候,就会对存储节点本身造成计算压力,而存储节点扩容则没有那么容易。
51
+
42
52
## 冷热分离
43
53
44
54
冷热分离和分片的想法类似,都是按照某种方法来将数据划分成子集。不过,数据分片,不同分片之间存储的机器配置通常是一样的。而冷热分离,则相当于给某些分片打上了不同属性,不同属性的数据根据特点存放到不同配置的机器上。例如,我们刷朋友圈,看到的几乎都是几天以内的照片,最好是马上就能加载出来,这部分照片占的容量比较小;几天以外的照片则很少被访问到,而且对访问速度要求也不高,但是它们加起来的占用空间非常大。提供高速访问的 SSD 容量小、价格高,而便宜量大的 HDD 访问速度则比较慢。根据这种特点,我们就可以将比较“旧”的照片存放到 HDD 存储,而将最近的照片存放到 SSD。同时,比较“旧”的照片可以使用压缩算法,用解压时间来换取更少的空间占用。
You can’t perform that action at this time.
0 commit comments