1. 什么是TCP/IPP 1.1. 什么网络协议 网络协议是一组用于网络上的计算机(或其他设备)之间通信的规则和数据格式的集合.
1.2. TCP/IP 在internel和很多其他网络上使用的网络协议族.
1.3. 端口 端口是用来将数据路由到适当网络应用程序的逻辑通道
1.4. DNS 负责将域名映射为IP地址
1.5. 路由器 通过逻辑地址来转发数据的一种网络设备,并且也可以将大型网络分为几个较小的子网.也可以 将一个局域子网从较大的网络中分离出来.
2. TCP/IP如何工作 2.1. tcp/ip四层模型 应用层: 提供网络排错设施,文件传输,远程控制和其他基于网络的工具,此外它还提供应用程序用来访问网络的API 传输层: 提供错误检测,流量控制,确认服务 网际层: 为数据报提供逻辑寻址和路由 网络访问层: 提供物理硬件的接口. 2.2. OSI七层模型 应用层: 为应用程序提供网络接口,支持文件传输,通信等功能的网络应用 表示层:把数据转换为标准格式,管理数据加密与压缩 会话层: 在计算机通信应用程序之间建立会话 传输层: 为网络提供错误控制和数据流控制 网络层: 支持逻辑寻址与路由选择. 数据链路层: 提供与网络适配器相连的接口,维护子网的逻辑链接 物理层:将数据转换为传输介质上的电子流或模拟脉冲,并且监视数据的传输 2.3. 哪一层处理帧 网络访问层.
2.4. 每一层封装数据的真实含义? 在发送端. 数据向下传输到下一层之前,会先在数据中附加一个特定层的报头.
在接收端,数据的还原需要进行一个封装的反过程,从物理层向上直到应用层,随着数据逐层向上传递,协议数据单元的报头及报尾被一层层剥离。
最终实现了数据从发送端到接收端的传递。
2.5. TCP 传输控制协议 传输层中一个可靠的, 面向连接的协议. 面向连接的协议提供更复杂的流量控制和错误控制, 相比UDP更可靠.因额外需要错误检查,所以比UDP慢
2.6. UDP 用户数据报协议 传输层中一个不可靠的,无连接的协议.比TCP快, 它把错误控制的责任推给了应用.Cobra 概念 Cobra有三个基本概念commands,arguments和flags。
commands代表行为
arguments代表数值
flags代表对行为的改变
例:
# clone是commands,URL是arguments,brae是flags
git clone URL --bare 使用 参考 使用 go cobra创建命令行项目1. 文件类 1.1. 查看文件大小 # 加 h 查看可读性的文件大小 ll -h # 查看文件夹大小 # --max-depth=1 表示查看文件夹的一层 du -h --max-depth=1 /usr 1.2. 压缩 ZIP
-r 递归处理,将指定目录下的所有文件和子目录一并处理。 -y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。 -v 显示指令执行过程或显示版本信息。 -j 只保存文件名称及其内容,而不存放任何目录名称。 -b 添加注释 -u 更新文件 # 压缩 # target.zip 是压缩后的文件名 # source-dir 要压缩的文件夹名 zip -r target.zip source-dir # 压缩保留软链, 只对类 unix 系统有效 # -y 保留软链 zip -ry target.zip source-dir # 压缩带注释 zip -ryb target.zip source-dir # 解压 unzip target.zip # 查看压缩文件, 不压缩 unzip -v target.分析过程 使用 pprof top分析 可见 json.Marshal占第一内存. 为什么呢? 我们进一步分析
使用 tree 分析 查看到 zerolog AppendInterface 方法占用 73.32%的内存量. 而 zerolog 是一个很优秀的日志库, 比 zap 还优秀. 为什么呢?我们需要查看源码
822.70MB 73.32% | github.com/rs/zerolog/internal/json.Encoder.AppendInterface 分析源码 找到 github.com/rs/zerolog/internal/json.Encoder.AppendInterface` 366 行
// AppendInterface marshals the input interface to a string and
// appends the encoded string to the input byte slice.
func (e Encoder) AppendInterface(dst []byte, i interface{}) []byte {
marshaled, err := json.Marshal(i)
if err != nil {
return e.查看 Clients 属性 127.0.0.1:6379>info clients # Clients
connected_clients:1 # 已连接客户端的数量(不包括通过从属服务器连接的客户端)
client_recent_max_input_buffer:2 # 当前连接的客户端当中,最长的输出列表
client_recent_max_output_buffer:0 # 当前连接的客户端当中,最大输入缓存
blocked_clients:0 # 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客户端的数量 查看 Memeory 属性 127.0.0.1:6379>info memory used_memory_human:1.92G # 用户数据所占用的内存,就是你缓存的数据的大小。
used_memory_rss_human:30.73M # 常驻内存, 与top占用内存一致
used_memory_peak_human:1.93G # 内存使用峰值
total_system_memory_human:1.78G # 整个系统的内存
mem_fragmentation_ratio:0.02 # 内存碎片比率. used_memory_rss/used_memory求的值. 如果小于1时,需要优化内存碎片. mem_fragmentation_ratio 查看内存碎片比率,
小于<1时,Redis实例可能会把部分数据交换到硬盘上,内存交换会严重影响Redis的性能,所以应该增加可用物理内存 大于>1时, 说明碎片占用 更多的内存, 需要整理, 在1~1.5 之间比较健康. 重启Redis服务;也能达到碎片整理目的
查看是否开启自动碎片整理: config get activedefrag
设置自动碎片整理: config set activedefrag yes
直接手动整理碎片: memory purge
redis.conf配置设置自动整理碎片
redis 4.0
# Enabled active defragmentation
# 碎片整理总开关
# activedefrag yes
# Minimum amount of fragmentation waste to start active defrag
# 当碎片达到 100mb 时,开启内存碎片整理
active-defrag-ignore-bytes 100mb
# Minimum percentage of fragmentation to start active defrag
# 当碎片超过 10% 时,开启内存碎片整理
active-defrag-threshold-lower 10
# Maximum percentage of fragmentation at which we use maximum effort
# #内存碎片超过 100%,则尽最大努力整理
active-defrag-threshold-upper 100
# Minimal effort for defrag in CPU percentage
# 内存自动整理占用资源最小百分比
active-defrag-cycle-min 25
# Maximal effort for defrag in CPU percentage
# 内存自动整理占用资源最大百分比
active-defrag-cycle-max 75 查看 Stats 属性 只列出部分属性.参考 Go 单元测试/性能测试
性能测试 go test -test.bench=. -test.benchmem 指定方法 go test -test.bench=MyFunc -test.benchmem cpu 性能分析 go test -test.bench=MyFunc -test.cpuprofile cpu.out 内存分析 go test -test.bench=MyFunc -test.memprofile mem.out goroutine 阻塞分析 go test -test.bench=MyFunc -test.blockprofile block.out ### 指定几个cpu分析
go test -test.bench=MyFunc -test.benchmem -test.cpu 1,2,4解析方案 // 替换 ioutil.ReadAll
func ReadAll(data io.ReadCloser) (body []byte) {
buffer := bytes.NewBuffer(make([]byte, 0, 65536))
io.Copy(buffer, data)
temp := buffer.Bytes()
length := len(temp)
if cap(temp) > (length + length/10) {
body = make([]byte, length)
copy(body, temp)
} else {
body = temp
}
return
} 参考 [golang]内存不断增长bytes.makeSlice
Golang Slices And The Case Of The Missing Memorytop 是 linux 最常用的命令, 包括很多少直观的信息, 有利于我们对系统运行状态的把握.
top 使用 top 系统自带命令,可以直接使用.
top top 详情 a. 如图编号(1)
top - 10:34:07 up 16 min, 1 user, load average: 0.00, 0.01, 0.05 10:34:07 当前时间 up 16 min 系统运行时间, 如 16 分钟 1 user 当前登陆用户数 load average: 0.00, 0.01, 0.05 系统负载. 三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。 b. 如图编号(2)
Tasks: 206 total, 1 running, 205 sleeping, 0 stopped, 0 zombie Tasks: 206 total 进程总数 1 running 正在运行的进程数 205 sleeping 睡眠进程数 0 stopped 停止进程数 0 zombie 僵尸进程数 c.