后山


  • 首页

  • 标签

  • 分类

  • 归档

不换源就不能用的工具们

发表于 2020-05-14 |

由于众多不同规模的防火墙存在,互联网不是总能互联的,有些工具在国内就很不好用。
通常有两种解决思路:

  1. 优化网络
  2. 换能访问的源

brew

  1. Homebrew
  2. Homebrew Core
  3. Homebrew Cask
  4. Homebrew-bottles
1
2
3
4
5
6
7
8
9
10
11
12
# 替换 Homebrew
git -C "$(brew --repo)" remote set-url origin https://mirrors.ustc.edu.cn/brew.git

# 替换 Homebrew Core
git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git

# 替换 Homebrew Cask
git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git

# 替换 Homebrew-bottles
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc
source ~/.zshrc

Snap

很不幸,国内似乎没有源,更不幸的是换源和翻墙可能也解决不了问题。
参考以前 pyenv 速度慢的 cache 文件替换法,最后采用打日志+外部下载+安装的方式解决了问题。
以安装 vscode 为例,具体分为以下步骤。

  • vim /usr/lib/systemd/system/snapd.service 观察得到 snapd 环境文件地址
  • vim /etc/sysconfig/snapd 中添加 SNAPD_DEBUG=1 和 SNAPD_DEBUG_HTTP=7
  • sudo snap install --classic code 运行改命令执行安装,速度正常的话就不需要进行下一步了,否则继续。我是碰到 100KB 以内的速度,并且下载到 50% 就会中断,被逼无奈只能继续。
  • journalctl -fxeu snapd 等卡一段时间之后运行该命令,从最后几行中找到 retry.go:49: DEBUG: Retrying https://api.snapcraft.io/api/v1/snaps/download/Ht0aUHi7ofh9Fbwh6m7jUN2pAy6kzBiu_40.snap, attempt 1, elapsed time=5.22µs 这一行日志,获取真实的下载地址
  • 这里需要一个配置良好的 aria2,下载速度飞起,我是上了 8MB 的速度,短时间就下完了。
  • 把正在运行的 snap 杀掉。
  • journalctl -fxeu snapd 从刚才那行日志上一行找到真实文件地址,将真实文件 mv 过去。
  • sudo snap install --classic code 再次执行该指令,经过文件校验之后可以直接安装。

计算机领域概念知识梳理(FAQ)

发表于 2020-05-13 |

如何理解「定时」?

运输层协议概念上提供定时保证

如何理解「缓存」?

如何理解「可靠性」?

  1. 使用补偿机制/重试

在 TCP 协议中,使用重试机制来保证可靠性。

  1. 使用锁

如何理解「复用」?

物理层:时分多路复用、频分多路复用、统计多路复用
TCP:连接复用

如何理解「分层」?

分层即垂直拆分,将一个复杂系统拆成不同的层次,每个层次只解决一类问题,使得软件架构更清晰、可维护性更好。
减少分层,在上层解决下层的问题通常是可行的,然而这会使系统变得复杂,难以维护。
例如因特网体系结构就是一个分层架构,这个分层架构整体上解决了端系统之间的通信问题。
因特网的五层分别是物理层、链路层、网络层、传输层、应用层,没有建立这两层 OSI 七层模型中的表示层和会话层。表示层的作用是数据解释,会话层的作用是数据定界和同步,这两层解决的问题不够通用,留给了应用开发者在应用层实现。

计算机网络知识梳理(FAQ)

发表于 2020-05-12 |

计算机网络概述

因特网的五个层次:
应用层 HTTP SMPT FTP
运输层 TCP UDP
网络层 IP
链路层
物理层

七层 ISO OSI 参考模型:
应用层
表示层
会话层
运输层
网络层
链路层
物理层

如何评价网络性能?

时延、丢包、吞吐量
时延、丢包:获取两个主机之间的 IP 连通情况可以使用 mtr(ping 和 traceroute),使用 ping.pe 可以评估目标主机在全球不同 ISP 的连通情况。
image.png
吞吐量:使用 iftop
TX:发送流量
RX:接收流量
TOTAL:总流量
Cumm:运行 iftop 到目前时间的总流量
peak:流量峰值
rates:分别表示过去 2s 10s 40s 的平均流量
DNS 情况:nslookup
TCP 端口:telnet

实际案例:

  1. 问卷投放后高峰期打开慢,经排查后台 IO 监控,使用网络检测工具实时查看网络情况,查看静态文件 js 文件容量,最终解决方案为将静态文件放到 CDN
  2. 梯子不稳定,使用 https://ping.pe/ 发现是特定网络下不稳定,切换接入网即可使用。

HTTP2 相对于 HTTP1.x 有什么新特性,HTTP1.x 对应的优化方案是什么?

HTTP2 通过支持完整的请求与响应复用来减少延迟,通过有效压缩 HTTP 报头字段将协议开销降至最低,同时增加对请求优先级和服务器推送的支持。

  • 单一长连接:减少建立连接的开销。三次握手在高延迟的场景下影响较明显,慢启动则对文件类大请求影响较大。
  • 二进制分帧层机制:实现了多路复用,去除线头阻塞(Head-Of-Line Blocking),请求重置,请求优先级等特性。
  • 报头压缩:采用 HPACK 来压缩请求头和响应头,降低协议开销
  • 服务端推送

HTTP2 介绍:https://segmentfault.com/a/1190000015030944
对应优化方案:

  • 为了去除线头阻塞
    • 并发请求:每个域名六个并发连接
    • 域名散列:一个网站使用多个域名
    • 阻塞渲染:css 放头部 js 放底部
  • 为了减少协议开销
    • 合并请求:异步接口合并,资源内联,减少请求数量

image.png

FTP 协议与 HTTP 协议的区别?

FTP 使用两个并行的 TCP 连接来传输文件,一个是控制连接,一个是数据连接。FTP 的控制信息是带外传送的,HTTP 是带内发送控制信息的。
FTP 是有状态的,HTTP 是无状态的。

SMTP 协议与 HTTP 协议的区别?

SMTP 是一个推协议,HTTP 是一个拉协议,要拉取邮件服务器里的邮件,需要使用 POP3、IMAP 或 HTTP 这种拉协议。
SMTP 的报文都使用 7 位 ASCII 码格式,HTTP 没有这个限制。

传输层的功能是什么?

传输层解决的基本问题是 1. 进程间数据交付(多路复用多路分解) 2. 差错检测
可以解决问题是 1.拥塞控制 2. 流量控制 3. 可靠通信 4. 差错控制/差错恢复
流量控制和拥塞控制的区别在于,拥塞控制是应对 IP 网络拥塞,流量控制是应对发送方发送和接收方读取速率不一致。

简述 TCP 和 UDP 的区别

面向连接的服务
无连接服务

可靠数据传输机制

检验和:检验错误
定时器:超时重传
序号:按顺序编号防止乱序
确认/否认:ack
窗口、流水线:提高发送效率,窗口长度必须小于等于序号空间大小的一半

TCP 三次握手和四次握手

建立连接 three-way handshake:

  1. 客户端发出 SYN 报文段 Synchronize Sequence Numbers
  2. 服务端接受 SYN 报文段,发出 SYN&ACK 报文段
  3. 客户端接受 SYN&ACK 报文段,发出新报文段确认建立连接,可以携带数据

关闭连接 :

  1. 客户端发出 FIN
  2. 服务端接受 FIN,发出 ACK
  3. 服务端发出 FIN
  4. 客户端接受 FIN,发出 ACK

image.png
image.png

TCP 拥塞控制机制

加性增,乘性减
慢启动乘性增,拥塞避免加性增,重复包乘性减,超时从头开始

image.png

IP 协议简述

ARP 协议简述

其他

端系统 end system
主机 host
客户机 client
服务器 server
通信链路 communication link
分组交换机 packet switch
路由器 router
链路层交换机 link-layer switch
因特网标准 internet standard
因特网工程任务组 IETE
请求评论 request for comment RFC
内联网 intranet
分布式应用程序 distributed application
对等应用程序 P2P application
协议 protocol
接入网 access network
边缘路由器 edge router
物理媒体 physical medium 双绞线、同轴电缆、光纤、无线电等等
尽力而为 best effort
电路交换 circuit switching
频分多路服用 FDM
时分多路服用 TDM
分组交换 packet switching
报文 message
报文段 segment
数据报 datagram
帧 frame
分组 packet
存储转发传输机制 store-and-forward transmission 存储转发时延
输出缓存 output buffer 输出队列 排队时延
丢包 packet lost
统计多路复用 statistical multiplexing
转发表 forwarding table
时延:节点总时延 total node delay 处理、排队、传输、传播
吞吐量 throughput
分层体系结构
协议栈 protocol stack

套接字 socket
控制连接 control connection
数据连接 data connection
递归查询 recursive query
迭代查询 iterative query
资源记录 Resource Record RR
套接字编程=客户机/服务器应用程序开发
流 stream

运输层/所有计算机网络的多路复用与多路分解 multiplexing demultiplexing
可靠数据传输 reliable data transfer
可靠数据传输协议-比特交替协议 alternating-bit protocal
流水线技术 pipelining
回退 N 步 Go-back-N GBN/滑动窗口 sliding window
选择重传 selective repeat SR
累计确认 cumulative acknowledgment
基于事件的编程 event-based programming 基于事件驱动 FSM 状态转移
最大报文段长度 maximum segment size MSS 应用层长度
最大传输单元 maximum transmission unit MTU
捎带 piggybacked
统计学 指数加权移动平均 EWMA
流量控制服务 flow-control service
拥塞控制 congestion control

其他工具

nmap 端口扫描器

Python 内存优化之 memory-profiler

发表于 2020-04-10 |

概述

简单用法

在函数上加装饰器 profile,正常启动
profile 的其他参数都是选填的

1
2
3
4
5
6
7
8
from memory_profiler import profile

@profile(precision=4,stream=open('memory_profiler.log','w+'))
def my_func():
a = [1] * (10 ** 6)
b = [2] * (2 * 10 ** 7)
del b
return a

##

参考文档

该库地址
https://pypi.org/project/memory-profiler/

中文用法简单说明:
https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_603days_1.html
中文详细说明:
https://www.cnblogs.com/kaituorensheng/p/5669861.html

分析方法

逐行打印内存增长

在可疑函数上套上 @profile 装饰器,运行服务进行压测,观察内存占用即可。
如果没有明显的可疑函数,可以从请求/任务的主入口开始进行分析,结合代码逐步定位问题。

1
2
3
4
5
6
7
8
Line #    Mem usage  Increment   Line Contents
==============================================
3 @profile
4 5.97 MB 0.00 MB def my_func():
5 13.61 MB 7.64 MB a = [1] * (10 ** 6)
6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7)
7 13.61 MB -152.59 MB del b
8 13.61 MB 0.00 MB return a

随时间内存占用情况

该图无法直接定位问题,只能用于辅助,直接使用 top 也能达到类似效果
image.png

交互式调试

支持 pdb 调试和 IPython 集成

注意事项

循环下

逐行打印下 Increment 表示循环语句最后一次执行时的内存变化,Mem usage 则是最后一次循环累积占用的内存

GC

删除对象不一定会立即释放内存,不同版本行为不一致,内存分析时可以显式调用 gc.collect() 强制释放内存
相关资料:
https://stackoverflow.com/questions/37075939/python-experiment-with-gc-and-memory-profiler
https://stackoverflow.com/questions/26046924/is-it-more-memory-efficient-to-set-variables-to-none-in-python
思考 premature optimization is the root of all evil

profile 的 stream 参数

示例中@profile 的 stream 为 open(‘memory_profiler.log’,’w+’),但是该写法仅限于脚本调试,在服务调试中不好用。
在服务中建议使用日志模块 LogFile,或者将标准输出导出到文件后进行处理。

接口安全性设计

发表于 2020-04-09 |

通常接口安全性都是指的客户端与服务端交互,但是这里额外研究一下直接通过浏览器和服务端交互的方式。

需要防止的内容

  • 被其他人调用
  • 被篡改请求
  • 被替换返回结果
  • 接口被重放

可以采取的措施

传输层

HTTPS 加密
IP 白名单

应用层

用户鉴别机制主要用于防止其他人调用:预先分配 token/appKey 等参数加在请求中,供服务端识别请求来源
时间戳超时机制主要用于防止接口被重放:接口中添加时间参数和唯一字符串,拒绝超时的请求,拒绝一定时间内已经请求过的的请求
参数/返回值加密主要用于防止数据被更改:将请求的参数加盐加密生成参数签名,在服务端重新计算参数签名进行比对

image.png

一种简单的认证方法:HTTP Basic 身份认证

https://juejin.im/entry/5ac175baf265da239e4e3999

123…9
Hieast

Hieast

快速学习者,高校慕课平台深度使用者,专注于挖掘数据的价值。目前从事 Python 数据开发,自媒体数据采集、分析和应用相关工作。

44 日志
5 分类
32 标签
RSS
GitHub E-Mail
© 2016 — 2020 Hieast
主题 — NexT.Pisces