内存管理相关
- Linux 的 OOM Killer 机制分析
- 浅谈 Linux 的内存管理
- Nginx 内存池源码分析
- 谈谈 shared_ptr 的那些坑
- 深入 C++ 的 unique_ptr
- 使用 Valgrind 检测 C++ 内存泄漏
Linux 有个 tc 工具,即 traffic control,可以用来模拟网络丢包和延迟。在开发后台 server 时,如果我们想要知道这个 server 在特定的网络丢包情况下,是否能表现良好,就可以用 tc 来模拟丢包率。
下面命令可以模拟丢包,从 eth0 网口出去的包将随机丢失 10%:
下面命令,从 eth0 网口出去的包将延迟 40ms:
注意,上面我们介绍的命令,是针对整个 eth0 网口起作用的,也就是说,只要是从 eth0 出去的所有的包,都会产生随机丢包或者延迟。但有时候,我们只想让丢包和延迟作用于某个目的地址,那要怎么做呢?
上面的命令,我们告诉 tc,对发往 199.91.72.192:36000
的网络包产生 13% 的丢包和 40ms 的延迟,而发往其它目的地址的网络包将不受影响。
好了,模拟完丢包和延迟之后,要记得删除掉规则:
在 Linux 我们可以使用 perf 工具分析 CPU 的性能,它可以将消耗 CPU 时间比较大的用户程序调用栈打印出来,并生成火焰图。首先,在 Ubuntu 安装 perf 工具:
使用sudo perf list
命令可以看到 perf 支持的事件,事件有三种类型:Software event、Hardware event 和 Tracepoint event。使用perf stat
可以对某个操作执行期间发生的事件作统计,例如我们可以对下面的命令进行统计:
我们可以统计这个命令执行期间的 CPU 使用率,上下文切换次数等信息:
另一个有用的命令是perf record
,它可以对事件进行采样,将采样的数据收集在一个 perf.data 的文件中,这将会带来一定的性能开销,不过这个命令很有用,可以用来找出最占 CPU 的进程。下面的命令对系统 CPU 事件做采样,采样时间为 60 秒,每秒采样 99 个事件,-g
表示记录程序的调用栈。
执行这个命令将生成一个 perf.data 文件:
sudo perf report -n
可以生成报告的预览。sudo perf report -n --stdio
可以生成一个详细的报告。sudo perf script
可以 dump 出 perf.data 的内容。 也可以记录某个进程的事件,例如记录进程号为 1641 的进程:
在 AWS 推荐使用 kops 安装 Kubernetes 集群,具体可以参见这篇文章。接着,在 Kubernetes 集群安装 Nginx Ingress:
上面的操作会为 Nginx Ingress 创建一个 ELB,这个 ELB 工作在 4 层,即监听 TCP 的 80 和 443 端口:
Nginx Ingress 主要用来充当前端代理,它可以根据域名以及 URL 路径,将集群外部的流量路由到集群内部的 Service。下面部署一个简单的 Service:
接着,为这个 Service 创建一个 Ingress 配置:
可以查看这个 Ingress 对应的 ELB 地址:
可以使用下面的命令检验 Ingress 是否正常工作:
可以使用 kube-lego 自动创建和更新 Let’s Encrypt 的证书,下面是 kube-lego 的安装步骤:
在 DNS 服务器增加一条 CNAME 记录,将echoheaders.umlife.net
解析到 ELB 的地址。接着,修改 Ingress 的配置,让 kube-lego 自动生成证书,并且在证书过期时,能够自动更新证书:
在浏览器访问echoheaders.umlife.net
,就可以看到已经配置好 HTTPS 证书了。
在 AWS 中,我们可以将 EBS 磁盘挂载到 Kubernetes 的 Pod 中。由于 EBS 是云磁盘,所以就算 Pod 被调度到其它宿主机,也仍然可以访问 EBS 中的数据。
在挂载磁盘之前,需要先创建 EBS 磁盘:
注意,如果 Kubernetes 集群是通过 kops 1.8.0 版本安装的,那么在挂载之前,需要先为磁盘打上标签,否则会挂载失败:
挂载磁盘很简单,例如,我们可以将磁盘挂载到 Nginx Pod 的/data
目录下:
通过这种方式挂载磁盘,有几个问题需要注意,首先,要保证 EBS 磁盘和 EC2 实例在同一个 AZ 里面,其次,EBS 磁盘只能挂载到一个 EC2 实例上。