1 Preface
在业务系统中,为了提高服务的性能,降低平均时延,一个常用的手段:增加cache。
鲁迅:-)人们发明一种方法解决一个问题,而几乎总是会引入另一个问题。
那么可能会问:Cache 要加在哪里,要缓存多久,才会更有效? 下面就拿一个例子,来展开看看。
2 分析
一般而言,需要对执行频率高,耗时占比大的逻辑,优先增加Cache。
但是要注意:增加 Cache 不能影响到业务的正确性。
适用场景:数据变化不频繁,因为一旦数据发生变化,Cache可能产生不一致。
对于不一致,还需要设计一个合理的失效时间,在业务可接受的误差之内增加cache。
3 实际场景分析
现在有个下游的缓存服务,请求量占Top1,如果仍然引入分布式缓存(如redis, memcached意义不大),
那么我们考虑增加 memory cache,在加Cache 之前,我们要对key的重复率进行分析。分析流程如下:
数据获取 → 解析数据 → 分析数据 → 可视化
3.1 数据获取
如果有数据分析平台,通过定制 sql 分析即可。
由于服务对于还未上报数据分析平台,所以尝试使用tcpdump,抓取连续10分钟的业务包来分析:
1
2
|
sudo timeout 10m tcpdump -i eth1 dst port 13196 -w out.cap -v
# capture need sudo
|
我们这里只捕获请求包 dst port 13196
3.2 解析数据
借助之前我们实现的 wireshark 协议插件,
略微改造一下: 在解析协议包时,把想要的字段 dump 一份,用于离线分析。
1
2
|
time tshark -r ad_packet_13196_10m.cap >/dev/null
# 2m05.50s real 60.79s user 61.89s sys
|
经过 2 分钟的解析,我们拿到了 vid.txt 列表(95w
条记录), 看下数据样例(head -n5
):
1
2
3
4
5
6
|
a320677esiq
j002624fcc5
d31318c4461
s0034ii0vrd
b0030omcpkx
...
|
3.3 分析数据 (重复单词个数统计)
借助 unique, sort 强有力的命令行工具:
1
|
cat vid.txt | sort | uniq -c | sort -k1nr > rank_10m.txt
|
解释一下:sort -k1 表示按第1列排序,n 按数值比较,r 逆序
处理完之后(25w
条记录)。 看下数据样例(head -n5
):
1
2
3
4
5
6
|
10242 t0035sxfrtv
8098 o3164lnasuz
6294 x00358r6ch4
...
1 z3206ww0zix
1 z3206z5mfq5
|
3.4 使用 awk 进行数据区分统计
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
|
#!/bin/awk -f
#运行前
BEGIN {
less2 = 0
less20 = 0
less50 = 0
moreThan50 = 0
total = 0
printf "NAME \t less2 \tless20 \tless50 \t moreThan50\n"
printf "-----+------+-----+------+-----+------+\n"
}
#运行中
{
total += $1
if ($1 < 2) {
less2+=$1
} else if ($1 < 20) {
less20+=$1
} else if ($1 < 50) {
less50+=$1
} else {
moreThan50+=$1
}
}
#运行后
END {
printf "TOTAL: %d \n", total
printf " buckets: \t%d \t%d \t%d \t%d \n", less2, less20, less50, moreThan50
total = total/100.0
printf " Percent: \t%2.2f%% \t%2.2f%% \t%2.2f%% \t%2.2f%% \n",
less2/total, less20/total, less50/total, moreThan50/total
}
|
1
2
3
4
5
6
|
$ awk -f count.awk rank_10m.txt
NAME less2 less20 less50 moreThan50
-----+------+-----+------+-----+------+
TOTAL: 948317
buckets: 155348 399847 108937 284185
Percent: 16.38% 42.16% 11.49% 29.97%
|
可视化展示:
4 总结
借助于 Linux 的小工具,实现数据批处理、分析,非常高效而且实用。
参考