文件描述符

高并发Web服务的演变—节约系统内存和CPU

梦想的初衷 提交于 2019-12-01 11:12:24
#0 系列目录# 应用系统架构 大型网站技术架构的演进与设计 大型网站技术架构的实践 大型网站图片服务器架构的演进 大型网站架构的灵魂—性能 大型网站架构的缓存 亿级Web系统搭建—单机到分布式集群 高并发Web服务的演变—节约系统内存和CPU #1 越来越多的并发连接数# 现在的Web系统面对的并发连接数在近几年呈现指数增长,高并发成为了一种常态,给Web系统带来不小的挑战。以最简单粗暴的方式解决,就是增加Web系统的机器和升级硬件配置。虽然现在的硬件越来越便宜,但是一味地通过增加机器来解决并发量的增长,成本是非常高昂的。 结合技术优化方案,才是更有效的解决方法 。 并发连接数为什么呈指数增长?实际上,从这几年的用户基数上看,这个数量并没有出现指数增长,因此它并非主要原因。 主要原因,还是web变得更复杂,交互更丰富所导致的 。 ##1.1 页面元素增多,交互复杂## Web页面元素越来越多,更为丰富。更多的资源元素,意味着更多的下载请求。Web系统的交互越来越复杂,交互场景和次数也大幅增加。以“www.qq.com”的首页为例子,刷新一次,大概会有244个请求。并且,在页面打开完成之后,还会有一些定时的查询或者上报请求持续运作。 目前的Http请求, 为了减少反复的创建和销毁连接行为,通常都建立长连接(Connection keep-alive) 。一经建立

Linux命令总结--lsof命令

被刻印的时光 ゝ 提交于 2019-12-01 10:16:51
简介 lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。 输出信息含义 在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。 直接输入lsof部分输出为: COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,1 4096 2 / init 1 root rtd DIR 8,1 4096 2 / init 1 root txt REG 8,1 150584 654127 /sbin/init udevd 415 root 0u CHR 1,3 0t0 6254 /dev/null udevd 415 root 1u CHR 1

【1】安装rabbitmq server

房东的猫 提交于 2019-12-01 08:47:03
安装erlang 1、下载源码wget http://www.erlang.org/download/otp_src_R16B02.tar.gz 2、安装erlang编译环境: yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel 3、解压otp_src_R16B02.tar.gz 4、mv otp_src_R16B02 erlang_R16B #重命名 5、安装erlang: cd erlang_R16B/ ./configure –prefix=/usr/local/erlang –with-ssl –enable-threads –enable-smp-support –enable-kernel-poll –enable-hipe –without-javac make && make install 6、配置erlang vim /etc/profile 末尾加上export PATH=$PATH:/usr/local/erlang/bin source /etc/profile 7、测试 whereis erlang 安装rabbitmq server 1、下载二进制包: http://www.rabbitmq.com/releases/rabbitmq-server/v3

Linux网络编程三、 IO操作

人盡茶涼 提交于 2019-12-01 07:13:32
  当从一个文件描述符进行读写操作时,accept、read、write这些函数会阻塞I/O。在这种会阻塞I/O的操作好处是不会占用cpu宝贵的时间片,但是如果需要对多个描述符操作时,阻塞会使同一时刻只能处理一个操作,从而使程序的执行效率大大降低。一种解决办法是使用多线程或多进程操作,但是这浪费大量的资源。另一种解决办法是采用非阻塞、忙轮询,这种办法提高了程序的执行效率,缺点是需要占用更多的cpu和系统资源。所以,最终的解决办法是采用IO多路转接技术。   IO多路转接是先构造一个关于文件描述符的列表,将要监听的描述符添加到这个列表中。然后调用一个阻塞函数用来监听这个表中的文件描述符,直到这个表中有描述符要进行IO操作时,这个函数返回给进程有哪些描述符要进行操作。从而使一个进程能完成对多个描述符的操作。而函数对描述符的检测操作都是由系统内核完成的。   linux下常用的IO转接技术有:select、poll和epoll。 select:   头文件:#include <sys/select.h>、#include <sys/time.h>、#include <sys/types.h>、#include <unistd.h>   函数:     int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set

4-7 selectors模块

时间秒杀一切 提交于 2019-12-01 06:49:53
一 了解select,poll,epoll IO复用:为了解释这个名词,首先来理解下复用这个概念,复用也就是共用的意思,这样理解还是有些抽象, 为此,咱们来理解下复用在通信领域的使用,在通信领域中为了充分利用网络连接的物理介质, 往往在同一条网络链路上采用时分复用或频分复用的技术使其在同一链路上传输多路信号,到这里我们就基本上理解了复用的含义, 即公用某个“介质”来尽可能多的做同一类(性质)的事,那IO复用的“介质”是什么呢?为此我们首先来看看服务器编程的模型, 客户端发来的请求服务端会产生一个进程来对其进行服务,每当来一个客户请求就产生一个进程来服务,然而进程不可能无限制的产生, 因此为了解决大量客户端访问的问题,引入了IO复用技术,即:一个进程可以同时对多个客户请求进行服务。 也就是说IO复用的“介质”是进程(准确的说复用的是select和poll,因为进程也是靠调用select和poll来实现的), 复用一个进程(select和poll)来对多个IO进行服务,虽然客户端发来的IO是并发的但是IO所需的读写数据多数情况下是没有准备好的, 因此就可以利用一个函数(select和poll)来监听IO所需的这些数据的状态,一旦IO有数据可以进行读写了,进程就来对这样的IO进行服务。 理解完IO复用后,我们在来看下实现IO复用中的三个API(select、poll和epoll

select()函数

北城余情 提交于 2019-12-01 04:53:07
原型: #include<sys/time.h> #include<unistd.h> int select(int maxfd, fd_set *rdset, fd_set *wrest, fd_set *exset, struct timeval *timeout); 参数: maxfd:描述需要监视最大文件描述符+1 rdset:监视的可读文件描述符的集合 wrset:监视的可写文件描述符的集合 exset:监视的异常文件描述符的集合 struct timeval:描述一段时间长度,如果在这个时间内,需要监视的描述符没有事件发生,返回0 返回值: 超时返回0 失败返回-1 成功返回大于0的整数,这个整数表示就绪描述符的数目 int FD_ZERO(fd_set *fdset):将指定的文件描述符集情况,在对文件描述符集合进行设置之前,必须对其进行初始化。如果不请空,由于在系统分配内存后,通常不做清空处理,所以结果时不可知的。 int FD_SET(int fd, fd_set *fdset); 用于在文件描述符集合中添加一个新的文件描述符 int FD_CLR(int fd, fd_set *fdset); 用于在文件描述符集合中删除一个新的文件描述符 int FD_ISSET(int fd, fd_set *fdset); 用于测试指定的文件描述符是否在该集合中。 注意

Python3 os.path() 模块

好久不见. 提交于 2019-11-30 21:45:51
os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示: 序 号 方法及描述 1 os.access(path, mode) :检验权限模式 2 os.chdir(path) 改变当前工作目录 3 os.chflags(path, flags) 设置路径的标记为数字标记。 4 os.chmod(path, mode) 更改权限 5 os.chown(path, uid, gid) 更改文件所有者 6 os.chroot(path) 改变当前进程的根目录 7 os.close(fd) 关闭文件描述符 fd 8 os.closerange(fd_low, fd_high) 关闭所有文件描述符,从 fd_low (包含) 到 fd_high (不包含), 错误会忽略 9 os.dup(fd) 复制文件描述符 fd 10 os.dup2(fd, fd2) 将一个文件描述符 fd 复制到另一个 fd2 11 os.fchdir(fd) 通过文件描述符改变当前工作目录 12 os.fchmod(fd, mode) 改变一个文件的访问权限,该文件由参数fd指定,参数mode是Unix下的文件访问权限。 13 os.fchown(fd, uid, gid) 修改一个文件的所有权,这个函数修改一个文件的用户ID和用户组ID,该文件由文件描述符fd指定。 14 os.fdatasync

五种IO模型

柔情痞子 提交于 2019-11-30 19:03:25
IO的产生   I/O输入/输出(Input/Output),分为IO设备和IO接口两个部分.   当用户进程调用了recvfrom这个系统调用,就引发了一次IO过程,这个时候的IO就要等待系统去磁盘上将数据读取读来,再拷贝到进程中 在网络情况下,IO通常分为两步   1.等待系统准备数据   2.数据从内核中拷贝到进程中   如果想提高IO的效率,就要减少准备数据的时间. 通常的IO模型分为5种   1.阻塞IO   2.非阻塞IO   3.事件驱动IO   4.多路复用IO   5.异步IO 1.阻塞IO   在内核将数据拷贝到进程中之前,整个进程都处在等待状态,就是阻塞IO   A拿着一支鱼竿在河边钓鱼,并且一直在鱼竿前等,在等的时候不做其他的事情,十分专心。只有鱼上钩的时,才结束掉等的动作,把鱼钓上来。       2.非阻塞IO   每次进程询问内核是否有数据准备好,即文件描述符缓冲区是否就绪。当有数据报准备好时,就进行拷贝数据报的操作。当没有数据报准备好时,也不阻塞程序,内核直接返回未准备就绪的信号,等待用户程序的下一个轮寻,减少数据等待的时间,当准备数据时,进程是在非阻塞状态的,可以去做一些其他操作.   B也在河边钓鱼,但是B不想将自己的所有时间都花费在钓鱼上,在等鱼上钩这个时间段中,B也在做其他的事情(一会看看书,一会读读报纸,一会又去看其他人的钓鱼等)

Linux 伪终端(pty)

房东的猫 提交于 2019-11-30 17:46:42
通过《 Linux 终端(TTY) 》一文我们了解到:我们常说的终端分为终端 tty1-6 和伪终端。使用 tty1-6 的情况一般为 Linux 系统直接连了键盘和显示器,或者是使用了 vSphere console 等虚拟化方案,其它情况下使用的都是伪终端。本文将介绍伪终端的基本概念。本文中演示部分使用的环境为 ubuntu 18.04。 伪终端 伪终端(pseudo terminal,有时也被称为 pty)是指伪终端 master 和伪终端 slave 这一对字符设备。其中的 slave 对应 /dev/pts/ 目录下的一个文件,而 master 则在内存中标识为一个文件描述符(fd)。伪终端由终端模拟器提供,终端模拟器是一个运行在用户态的应用程序。 Master 端是更接近用户显示器、键盘的一端,slave 端是在虚拟终端上运行的 CLI(Command Line Interface,命令行接口)程序。Linux 的伪终端驱动程序,会把 master 端(如键盘)写入的数据转发给 slave 端供程序输入,把程序写入 slave 端的数据转发给 master 端供(显示器驱动等)读取。请参考下面的示意图(此图来自互联网): 我们打开的终端桌面程序,比如 GNOME Terminal,其实是一种终端模拟软件。当终端模拟软件运行时,它通过打开 /dev/ptmx

linux 文件属性操作及文件结构

こ雲淡風輕ζ 提交于 2019-11-30 15:14:39
在Linux下进行C/C++编程,主要通过以下三个系统调用来获取文件(普通文件,目录,管道,socket,字符,块等)属性。 头文件“#include <sys/stat.h>” (1) //通过文件名称获取文件属性 int stat(const char *restrict pathname, struct stat *restrict buf); (2) //通过文件描述符获取文件属性 int fstat(int filedes, struct stat *buf); (3) //通过符号文件名称获取文件属性 int lstat(const char *restrict pathname, struct stat *restrict buf); 返回值(三个函数一样)成功:0 失败:-1 三个系统调用的区别: 1. fstat接受的第一个参数是“文件描述符”,stat和lstat是“文件全路径”,文件描述符需要用调用open之后才能得到,文件全路经直接写即可; 2. lstat获取的是该符号链接本身的信息;而stat获取的是该链接指向的文件的信息; 这三个系统调用都依赖一个重要的结构体struct stat stat结构体: struct stat { mode_t st_mode; //文件对应的模式,文件,目录等 ino_t st_ino; //inode节点号 dev_t