-
zabbix企业应用:利用自动发现监控IIS站点
的应用文章: zabbix应用之Low-level discovery监控磁盘IO:http://qicheng0211.blog.51cto.com/3958621/1599776 zabbix应用之nginx
时间:2016-09-28收藏
-
解决zabbix图形显示“方块”问题
系列系统复制一种中文字体: 控制面板->字体->复制一个中文字体 如:宋体,即:simsun.ttc (2)复制该字体文件到zabbix的web端的fonts目录下: 如:/usr/local/nginx
时间:2016-09-22收藏
-
Apache select和Nginx epoll模型区别
部分内容摘自跟老男孩学Linux运维:Web集群实战(运维人员必备书籍) http://oldboy.blog.51cto.com/2561410/1752270 1.select 和epoll模型区别 1.1.网络IO模型概述 通常来说,网络IO可以抽象成用户态和内核态之间的数据交换。一次网络数据读取操作(read),可以拆分成两个步骤:1)网卡驱动等待数据准备好(内核态)2)将数据从内核空间拷贝到进程空间(用户态)。根据这两个步骤处理方式不一样,我们通常把网络IO划分成阻塞IO和非阻塞IO。 ·阻塞IO。用户调用网络IO相关的系统调用时(例如read),如果此时内核网卡还没有读取到网络数据,那么本次系统调用将会一直阻塞,直到对端系统发送的数据到达为止。如果对端一直没有发送数据,则本次调用将永远不会返回。 ·非阻塞IO。当用户调用网络IO相关的系统调用时(例如read),如果此时内核网络还没有收到网络数据,那么本次系统调用将会立即返回,并返回一个EAGAIN的错误码。 在没有IO多路复用技术之前,由于没有一种好的方式来探测网络IO是否可读可写。因此,为了增加系统的并发连接量,一般是借助多线程或多进程的方式来增加系统的并发连接数。但是这种方式有个问题就是系统的并发连接数受限于操作系统的最大线程或进程数,并且随着操作系统的线程或进程数增加,将会引发大量的上下文切换,导致系统的性能急剧下降。为了解决这个问题,操作系统引入了IO多路转接技术(IO multiplexing)。 1.2.IO多路转接技术 IO多路转接技术其实就是使用select、epoll等操作系统提供的系统调用来检测IO事件的各种机制。通过select、epoll等机制,我们可以很轻松的同时管理大量的网络IO连接,并且获取到处于活跃状态的连接。当其中一个或多个发生网络IO事件时,select、epoll等系统调用就会返回相应的连接,我们就可以对这些连接进行读取或写入操作,从而完成网络数据交互。 1.3.select 工作原理 select函数原型: int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); select各个参数说明: ·nfds 这个参数的值一般设置为读集合(readfds)、写集合(writefds)以及exceptfds(异常集合)中最大的描述符(fd)+1,当然也可以设置为FD_SETSIZE。FD_SETSIZE是操作系统定义的一个宏,一般是1024。也就是说读写以及异常集合大小的最大值是1024,所以使用select最多只能管理1024个连接。如果大于1024个连接,select将会产生不确定行为。 ·readfds 指向可读描述符集的指针,如果我们关心连接的可读事件,需要把连接的描述符设置到读集合中。 ·writefds 指向可写描述符集的指针,如果我们关心连接的可写事件,需要把连接的描述符设置到可写集合中。 ·exceptfds 指向异常描述符集的指针,如果我们关心连接的是否发生异常,需要把连接的描述符设置到异常描述符集合中。 ·timeout 指select愿意等待的时间。 struct timeval { longtv_sec; //秒数 longtv_usec; //微秒数 } 一般来说,分为三种情况: ·timeout为空,select将会永远等待。直到有连接可读、可写或者被信号中断时返回。 ·timeout->tv_sec = 0 且 timeout->tv_usec = 0,完全不等待。检测所有指定的描述符后立即返回。这是得到多个描述符的状态而不阻塞select函数的轮询方法。 ·timeout->tv_sec != 且 timeout->tv_usec != 0,等待指定的秒数和微秒数。当指定的描述符之一已经准备好,或者超过了指定的时间值,则立即返回。如果超时了,还没有一个描述符准备好,则返回0。 select的工作原理,select通过轮询来检测各个集合中的描述符(fd)的状态,如果描述符的状态发生改变,则会在该集合中设置相应的标记位;如果指定描述符的状态没有发生改变,则将该描述符从对应集合中移除。因此,select的调用复杂度是线性的,即O(n)。举个例子,一个保姆照看一群孩子,如果把孩子是否需要尿尿比作网络IO事件,select的作用就好比这个保姆挨个询问每个孩子:你要尿尿吗?如果孩子回答是,保姆则把孩子拎出来放到另外一个地方。当所有孩子询问完之后,保姆领着这些要尿尿的孩子去上厕所(处理网络IO事件)。 select的限制,前面提到FD_SETSIZE宏,这个宏是操作系统定义的。在linux下面通常是1024,也就是说select最多只能管理1024个描述符。如果大于1024的个描述,select将会产生不可预知的行为。那在没有poll或epoll的情况下,怎样使用select来处理连接数大于1024的情况呢?答案是使用多线程技术,每个线程单独使用一个select进行检测。这样的话,你的系统能够处理的并发连接数等于线程数*1024。早期的apache就是这种技术来支撑海量连接的。 1.4.epoll工作原理 epoll函数原型: int epoll_create(int size); intepoll_ctl(int epfd, int op, int fd, struct epoll_event *event); int epoll_wait(intepfd, struct epoll_event *events, intmaxevents, int timeout); epoll依赖上述三个函数,既可以完成成千上万的并发连接管理。epoll使用方式,1)通过epoll_create建立epoll句柄。2)将描述符所感兴趣的事件通过epoll_ctl添加到epoll句柄中。3)调用epoll_wait返回所有可读写的描述符。 epoll是Linux内核为处理大批量文件描述符而作了改进的epoll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。 还是以保姆照看一群孩子为例,在epoll机制下,保姆不再需要挨个的询问每个孩子是否需要尿尿。取而代之的是,每个孩子如果自己需要尿尿的时候,自己主动的站到事先约定好的地方,而保姆的职责就是查看事先约定好的地方是否有孩子。如果有小孩,则领着孩子去上厕所(网络事件处理)。因此,epoll的这种机制,能够高效的处理成千上万的并发连接,而且性能不会随着连接数增加而下降。 1.5.select和epoll对比 综上所述,select和epoll对比如下表所示 select epoll 性能 随着连接数增加,急剧下降。处理成千上万并发连接数时,性能很差。 随着连接数增加,性能基本上没有下降。处理成千上万并发连接时,性能很好。 连接数 连接数有限制,处理的最大连接数不超过1024。如果要处理超过1024个连接数,则需要修改FD_SETSIZE宏,并重新编译 。 连接数无限制。 内在处理机制 线性轮询 回调callback 开发复杂性 低 中 老男孩教育最新课程select和epoll简单区别比喻 select的调用复杂度是线性的,即O(n)。举个例子,一个保姆照看一群孩子,如果把孩子是否需要尿尿比作网络IO事件,select的作用就好比这个保姆挨个询问每个孩子:你要尿尿吗?如果孩子回答是,保姆则把孩子拎出来放到另外一个地方。当所有孩子询问完之后,保姆领着这些要尿尿的孩子去上厕所(处理网络IO事件)。 还是以保姆照看一群孩子为例,在epoll机制下,保姆不再需要挨个的询问每个孩子是否需要尿尿。取而代之的是,每个孩子如果自己需要尿尿的时候,自己主动的站到事先约定好的地方,而保姆的职责就是查看事先约定好的地方是否有孩子。如果有小孩,则领着孩子去上厕所(网络事件处理)。因此,epoll的这种机制,能够高效的处理成千上万的并发连接,而且性能不会随着连接数增加而下降。
时间:2016-09-21收藏
-
nginx android app 慢网络请求超时
最近遇到了android 在慢网络下面请求服务器报 java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by peer) java.net.SocketTimeoutException: failed to connect to mobile2.itanzi.com/120.27.142.146 (port 80) after 15000ms java.net.SocketTimeoutException: timeout java.net.UnknownHostException: Unable to resolve host "mobile2.itanzi.com": No address associated with hostname 而ios 不存在这个问题,一直没有搞懂什么原因,总以为是android 的原因 netstat -an |grep 'ESTABLISHED' |grep 'tcp' |wc -l 243 一个 tcp_tw_recycle ,为了支持高并发,开启了这个,也就是tcp请求回收,如果开了这个,那在默认60s内同一个ip包过来是会被回收的,而游戏网络很多都是经过多层代理网络的,代理网络过来的数据包的时间肯定是小于这个请求时间的,那么服务器就会认为他是无效的连接,就会拒绝连接,所以才会出现TCP包重传,基于实践是检查理论的唯一标准,那就试着改吧 vim /etc/sysctl.conf net.ipv4.tcp_tw_reuse = 0 net.ipv4.tcp_tw_recycle = 0 网上查了一下: tcp_tw_reuse、tcp_tw_recycle 使用场景及注意事项 linux TIME_WAIT 相关参数: net.ipv4.tcp_tw_reuse = 0 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭 net.ipv4.tcp_tw_recycle = 0 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭 net.ipv4.tcp_fin_timeout = 60 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间(可改为30,一般来说FIN-WAIT-2的连接也极少) 注意: - 不像Windows 可以修改注册表修改2MSL 的值,linux 是没有办法修改MSL的,tcp_fin_timeout 不是2MSL 而是Fin-WAIT-2状态. - tcp_tw_reuse 和SO_REUSEADDR 是两个完全不同的东西 1. tw_reuse,tw_recycle 必须在客户端和服务端timestamps 开启时才管用(默认打开) 2. tw_reuse只对客户端起作用,开启后客户端在1s内回收 3. tw_recycle 对客户端和服务器同时起作用,开启后在3.5*RTO 内回收,RTO 200ms~ 120s 具体时间视网络状况。 内网状况比tw_reuse 稍快,公网尤其移动网络大多要比tw_reuse 慢,优点就是能够回收服务端的TIME_WAIT数量 对于客户端 1. 作为客户端因为有端口65535问题,TIME_OUT过多直接影响处理能力,打开tw_reuse 即可解决,不建议同时打开tw_recycle,帮助不大。 2.tw_reuse 帮助客户端1s完成连接回收,基本可实现单机6w/s请求,需要再高就增加IP数量吧。 3. 如果内网压测场景,且客户端不需要接收连接,同时tw_recycle 会有一点点好处。 4. 业务上也可以设计由服务端主动关闭连接 对于服务端 1. 打开tw_reuse无效 2. 线上环境tw_recycle不要打开 服务器处于NAT 负载后,或者客户端处于NAT后(这是一定的事情,基本公司家庭网络都走NAT); 公网服务打开就可能造成部分连接失败,内网的话到时可以视情况打开; 像我所在公司对外服务都放在负载后面,负载会把timestamp 都给清空,好吧,就算你打开也不起作用。 3. 服务器TIME_WAIT高怎么办 不像客户端有端口限制,处理大量TIME_WAIT Linux已经优化很好了,每个处于TIME_WAIT 状态下连接内存消耗很少, 而且也能通过tcp_max_tw_buckets =262144配置最大上限,现代机器一般也不缺这点内存。 下面像我们一台每秒峰值1w请求的http 短连接服务,长期处于tw_buckets 溢出状态, tw_socket_TCP 占用70M, 因为业务简单服务占用CPU 200% 运行很稳定。
时间:2016-09-19收藏
-
docker private registry使用
docker01 tag image:tag一个 image,名称一定要标准(registryAddress[:端口]/项目/imageName[:tag]),最后将其 push 即可 : docker tag nginx
时间:2016-09-19收藏
-
生产环境运行Docker的关键决策 (云栖征文)
处理好容器和宿主机之间的负载均衡,常见的做法是使用像Nginx或HAProxy这样的工具来实现。
时间:2016-09-18收藏
-
Elasticsearch hadoop使用示例 & 运维实战之集群规划 &presto-elasticsearch connecto...
反向代理 为了记录针对集群的查询内容,建议使用nginx来做反向代理,nginx安装在client node上,conf.d/default.conf最简单的配置如下 upstream elasticsearch
时间:2016-09-16收藏
-
项目实战:zabbix监控MySQL状态、服务信息
上一篇给大家分享了监控Nginx《项目实战:创建模板,监控Nginx状态、服务信息》,这里跟大家分享一下监控MySQL的记录,如果你没有安装MySQL可以参考我另一篇博文《ubuntu安装配置LNMP》
时间:2016-09-14收藏
-
【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲
3 视频服务器端:一般是一台 nginx 服务器,用来接受视频录制端提供的视频源,同时提供给视频播放端流服务。 简单流程: 5. 怎样进行音视频采集?
时间:2016-09-14收藏
-
京东微信手Q运维体系概览
质量监控平台 GMS基础监控平台根据openfalcon开源修改,对实体机和docker进行基础项、组件和自定义的监控告警,日志监控目前自研平台,通过对日志的采集过滤和统计,接入GMS基础监控平台,对nginx
时间:2016-09-13收藏
-
阿里云容器服务--自定义路由和负载均衡策略
简单示例 让我们先从一个简单的例子开始,我们会部署一个acs/proxy容器,容器前面配置一个slb实例,让大家可以访问,同时在后端挂上一个nginx,这里我们只展示nginx的首页。
时间:2016-09-10收藏
-
kibana4 分析和搜索仪表板 安装和配置
(Nginx 代理配置) 因为 Kibana4 不再是 Kibana3 那种纯静态文件的单页应用,所以其服务器端是需要消耗计算资源的。
时间:2016-09-08收藏
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7设置SWAP分区,小内存服务器的救世主
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境