上药三品,神与气精

曾因酒醉鞭名马 生怕情多累美人


  • 首页

  • 关于

  • 分类

  • 标签

  • 归档

  • 搜索

当谈论到高并发时,在谈论什么

发表于 2019-05-04 | 阅读次数:
字数统计: 1.4k | 阅读时长 ≈ 5

1、django和python的缺陷分析

django作为一个python实现的web服务器,它的性能其实是没有多大保证的。这是因为python的线程是不能共享机器资源的(因为万恶的GIL),线程们只是通过频繁切换控制权,来分享一个core上的时间片,让你看起来是并发在跑,但是其实同一个时间只有一个线程在跑。那python是不是在自欺欺人?不是的。看你程序的类型:

1)IO密集型

IO密集型程序的耗时基本都在打开文件/打开句柄进行读写,也就是消耗在IO上。这种类型的程序,当线程阻塞在IO上时,交出线程控制权,给其他线程运行,当IO完成后再获得控制权继续跑,这样的话,可以在IO的时候跑其他的线程,其实是可以提高代码运行效率的。

2)计算密集型

你的程序基本就没有IO,而是在跑一个算法。那么对不起,这种类型的程序,你通过python多线程编程无法提升效率,甚至会再频繁切换线程控制权时,损失效率。

3)协线程greenlet

python的这种类型的线程(我们姑且叫他线程),只在IO阻塞的情况下进行线程控制权的切换。而gevent就是协线程的一个实现。


启动方式

nohup gunicorn –worker-class=gevent dmonitor.wsgi:application -b 0.0.0.0:8009 -w 4 &

–worker-class:指定了异步方式,使用的是gevent方式实现的异步,也就是每个worker(进程)中线程之前切换使用的是协线程切换。

dmonitor.wsgi:application:dmonitor是django工程的名称,你的django工程中要有wsgi.py文件。

-b:你的进程服务绑定哪个ip和端口

-w:启动几个worker

介绍一下gunicorn

1)主从结构

gunicorn其实是个pre-fork的主从结构:一个master进程管理着多个worker进程,之前我们起了4个进程,但是实际上有5个就是因为有一个是master进程。

master进程不对外提供api,只是进行集群的管理,核心就是探活,一旦发现有worker进程挂掉了,那么master会把它拉起来。

2)worker数量的选择

官方给出的公式是worker_num = (2 x $num_cores) + 1,num_cores是机器核数。

官方又说了,一般配置的数量是4-12个,就能够支持上万QPS。当然前提是你的web服务能处理的过来。

在说nginx部署之前,先说一些废话。

可能大家有个疑问,gunicorn和nginx有啥区别?或者说我使用了gunicorn已经启动了多个实例,并且进行了负载均衡,我为什么要需要nginx呢?

一般来说是需要nginx的,原因有这几点:

1)你的服务有没有静态文件?

2)你需不需要做灰度,需不需要拦截功能等等等?

3)你能保证你的服务能抗的住高峰压力?

nginx的强大能让你拥有上述的能力。当然nginx作为一个已经在无数生产环境中验证过的web容器,还是很省心的。

回到这个系列,我们是想解决高并发异步场景,那么对高并发使用nginx有什么好处呢?

nginx可以做为一个缓冲器,nginx在接收完request之后,才开始转发,如果nginx后面的服务疲于相应,nginx就会缓存request,等待空闲来到再进行转发。这样提高了系统的弹性。

部署nginx其实并没有什么区别,因为通过gunicorn启动的服务对外也只有一个ip:port

注意:我们这里是把静态文件直接通过nginx进行转发的,而不是通过web服务的模板引擎。这充分利用了nginx的高性能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

upstream dmonitor {
server 10.93.84.53:8009;
}
server {
listen 8080;

server_name 10.93.84.53;
access_log /var/log/nginx/dmonitor.log;

location / {
proxy_pass http://dmonitor;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

location /static/ {
#静态文件目录
root /home/.../static;
}

热加载配置文件

1
2

./nginx -s reload

高性能

简单的系统更容易达到高性能

早期的计算机系统 是没有操作系统的 只有输入 输出 计算

手工输入的速度远低于计算机的计算速度

于是出现了批处理操作系统 缺点是只能有一个任务 当系统进行I/O处理的时候 CPU是空闲的

后来发明了进程 一个进程代表了一个任务 多个进程通过分时操作能让用户认为并行操作多任务 进程之间的资源是独立单元 但是可以通过介质进行通信(但是只能串行处理 无法很好分工合作)

后来就有了操作系统调度的最小单元线程 线程能够使进程内的子任务能够共享进程内的资源 并并行工作 大大提高性能

线程是任务调度的最小单元 共用进程内的资源

进程是资源分配的最小单元 与其他进程资源相互独立

高可用

系统无中断地执行其功能的能力 代表系统的可用性程度 是进行系统设计时的准则之一

本质上都是通过“冗余”来实现高可用

可扩展性

低成本、安全、规模

故障处理

发表于 2019-05-03 | 阅读次数:
字数统计: 124 | 阅读时长 ≈ 1
  • 重启和限流
  • 回滚操作
  • 降级操作
  • 紧急更新
  • 故障处理的整个流程
  • 故障原因分析
  • ask 5 whys
  • 故障后续整改计划

  • 为什么只发邮件 没有短信

  • 慢SQL 问题
  • 优化开发过程中的问题
  • 优化团队能力
  • 根除问题的本质
  • 举一反三解决当下的故障
  • 简化复杂、不合理的技术架构、流程和组织
  • 全面改善和优化整个系统 包括组织

利用好自己的时间

发表于 2019-05-03 | 阅读次数:
字数统计: 180 | 阅读时长 ≈ 1

投资自己的时间

花时间学习基础知识和文档

花时间在解放自己生产力的事情上

花时间在让自己成长的事情上

花时间在建立高效的环境上

规划自己的时间

定义好优先级

最短作业优先

想清楚再做

关注长期利益规划

学会规划自己的行动计划 不是短期的 而是一个中长期的

按照季度来规划 这个季度做什么 达到什么目标

一年往前走四步 而不是考虑眼下

用好自己的时间

将军赶路不追小兔

形成习惯

形成正反馈

反思和举一反三

EFK使用

发表于 2019-05-02 | 阅读次数:
字数统计: 614 | 阅读时长 ≈ 2

EFK不是一个软件,而是一套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用,是目前主流的一种日志系统。EFK是三个开源软件的缩写,分别表示:Elasticsearch , FileBeat, Kibana , 其中ELasticsearch负责日志保存和搜索,FileBeat负责收集日志,Kibana 负责界面,当然EFK和大名鼎鼎的ELK只有一个区别,那就是EFK把ELK的Logstash替换成了FileBeat,因为Filebeat相对于Logstash来说有2个好处:
1、侵入低,无需修改程序目前任何代码和配置
2、相对于Logstash来说性能高,Logstash对于IO占用很大
当然FileBeat也并不是完全好过Logstash,毕竟Logstash对于日志的格式化这些相对FileBeat好很多,FileBeat只是将日志从日志文件中读取出来,当然如果你日志本身是有一定格式的,FileBeat也可以格式化,但是相对于Logstash来说,还是差一点

Filebeat隶属于Beats。目前Beats包含六种工具:
Packetbeat(搜集网络流量数据)
Metricbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
Filebeat(搜集文件数据)
Winlogbeat(搜集 Windows 事件日志数据)
Auditbeat( 轻量型审计日志采集器)
Heartbeat(轻量级服务器健康采集器)

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

wget http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-linux-x64.tar.gz?AuthParam=1536892035_945cb24c750d0971b8c5b1925cc723a9

mv jdk-8u181-linux-x64.tar.gz\?AuthParam\=1536892035_945cb24c750d0971b8c5b1925cc723a9 jdk-8u181-linux-x64.tar.gz

tar -zxvf jdk-8u181-linux-x64.tar.gz

# 编辑环境变量

vi /etc/profile

JAVA_HOME=/usr/local/jdk1.8.0_181/
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH

source /etc/profile

java -version

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.4.tar.gz

tar -zxvf elasticsearch-6.2.4.tar.gz

vi config/elasticsearch.yml

network.host: 0.0.0.0
http.port: 9200

$ adduser elastic
#设置密码
$ passwd elastic
#需要输入2次密码
#授权
$ chmod -R 777 /usr/local/elasticsearch-6.2.4
#切换用户
$ su elastic

./bin/elasticsearch

vi /etc/security/limits.conf

vi /etc/sysctl.conf

sysctl -p

wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.4-linux-x86_64.tar.gz

tar -zxvf kibana-6.2.4-linux-x86_64.tar.gz

vi config/kibana.yml

elasticsearch.url: "http://localhost:9200"
server.host: "0.0.0.0"
kibana.index: ".kibana"

./bin/kibana

wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-linux-x86_64.tar.gz

tar -zxvf filebeat-6.2.4-linux-x86_64.tar.gz

vi filebeat.yml


filebeat.prospectors:
- type: log
enabled: true
paths:
- /var/xxx/*.log
- /var/xxx/*.out
multiline.pattern: ^\[
multiline.negate: true
multiline.match: after
setup.kibana:
host: "localhost:5601"
output.elasticsearch:
hosts: ["localhost:9200"]

./filebeat -c /usr/local/filebeat/filebeat.yml

端口 9200/5601/

异步编程(python3)

发表于 2019-05-02 | 阅读次数:
字数统计: 360 | 阅读时长 ≈ 1

python 在异步编程的过程中 经历了哪些更新

3.4版本引入了 asyncio 有了支持异步IO的标准库
3.5 提供了两个新的关键字async/await 更好标识异步IO 异步编程看起来会更加美好
3.6 推出了稳定版的 asyncio 迈着坚定而且稳重的步伐向异步编程靠近

Sanic是一个支持 async/await 语法的异步无阻塞框架,这意味着我们可以依靠其处理异步请求的新特性来提升服务性能,如果你有Flask框架的使用经验,那么你可以迅速地使用Sanic来构建出心中想要的应用,并且性能会提升不少,我将同一服务分别用Flask和Sanic编写,再将压测的结果进行对比,发现Sanic编写的服务大概是Falsk的1.5倍。

仅仅是Sanic的异步特性就让它的速度得到这么大的提升么?是的,但这个答案并不标准,更为关键的是Sanic使用了uvloop作为asyncio的事件循环,uvloop由Cython编写,它的出现让asyncio更快,快到什么程度?这篇文章中有介绍,其中提出速度至少比 nodejs、gevent 和其他Python异步框架要快两倍,并且性能接近于用Go编写的程序,顺便一提,Sanic的作者就是受这篇文章影响,这才有了Sanic。

1…789…109
John Cheung

John Cheung

improve your python skills

543 日志
33 分类
45 标签
RSS
GitHub Email
© 2020 John Cheung
本站访客数:
|
主题 — NexT.Pisces v5.1.4
博客全站共226.3k字