异步io

C# .net 提升 asp.net mvc, asp.net core mvc 并发量

此生再无相见时 提交于 2019-12-06 06:29:04
1.提升System.Net.ServicePointManager.DefaultConnectionLimit 2.提升最小工作线程数 使用ThreadPool.GetMinThreads(out workerThreads, out completePortsThreads); 方法可以得到当前“最小工作线程数”和“最小IO工作线程数”,这两个值默认等于CPU核心数,我这里等于6. 显然,这点并发处理能力是不够的。需要提升,但又不能超过“最大工作线程数”除以2,超过后,又被还原成默认值了。 方式一,在代码中加大(.net mvc 在Application_Start(),.net core mvc 在Program.Main ,只要在合适的时机调整即可): 、 StringBuilder scLog = new StringBuilder(); try { scLog.AppendLine("默认的 System.Net.ServicePointManager.DefaultConnectionLimit:" + System.Net.ServicePointManager.DefaultConnectionLimit.ToString()); if (System.Net.ServicePointManager.DefaultConnectionLimit <= 300)

Pipe——高性能IO(三)

心已入冬 提交于 2019-12-06 05:52:25
Pipelines可以替换掉那些丑陋的封装(kludge)、变通(workaround)或妥协(compromise)——用一个在框架中设计优雅的专门的解决方案。 敢肯定,下面所覆盖的那些痛点,对于那些工作在"数据协议(data protocol)"层面的人来说,一定非常熟悉。 PIPELINES替代/完善了什么? 首先:现有框架中最接近Pipelines的是什么?很简单,Stream ,Stream API对于那些做过序列化或是数据协议工作的人来说非常熟悉,但是,Stream其实是一个非常模糊的API——它在不同的场景表现地非常不同: 一些Stream是只读的,一些是只写的,一些是读/写的 一样的实体类型有时候是只读的,而有时是只写的(比如 DeflateStream ) 当一个Stream是读/写时,它像是一个磁带,读写操作全作用于同样的下层数据( FileStream , MemoryStream ) ,而有时它像是两个不同的Stream,读写作用于本质上完全不同的两个Stream( NetworkStream , SslStream )——即duplex stream 在许多deplex(双工)场景下,很难甚至根本不可能表达“之后没有新数据会到来,但是你应该继续读取数据直到结束“——只有 Close() ,而它会将deplex的两部分同时关闭 有时Stream会是可探查的

Socket 编程

末鹿安然 提交于 2019-12-06 05:46:10
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。 传输层 实现 端到端 的通信,因此,每一个传输层连接有两个端点。那么,传输层连接的端点是什么呢?不是 主机 ,不是主机的 IP地址 ,不是应用进程,也不是传输层的协议端口。传输层连接的端点叫做套接字(socket)。 根据RFC793的定义: 端 口号 拼接到IP地址就构成了套接字。所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。 总之,套接字Socket=(IP地址:端口号),套接字的表示方法是点分十进制的IP地址后面写上端口号,中间用冒号或逗号隔开。每一个传输层连接唯一地被通信两端的两个端点(即两个套接字)所确定。 套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中

一文让你读懂懂阻塞、非阻塞、同步、异步IO

倖福魔咒の 提交于 2019-12-06 01:24:02
介绍 在谈及网络IO的时候总避不开阻塞、非阻塞、同步、异步、IO多路复用、select、poll、epoll等这几个词语。在面试的时候也会被经常问到这几个的区别。本文就来讲一下这几个词语的含义、区别以及使用方式。 Unix网络编程一书中作者给出了五种IO模型: 1、BlockingIO - 阻塞IO 2、NoneBlockingIO - 非阻塞IO 3、IO multiplexing - IO多路复用 4、signal driven IO - 信号驱动IO 5、asynchronous IO - 异步IO 这五种IO模型中前四个都是同步的IO,只有最后一个是异步IO。信号驱动IO使用的比较少,重点介绍其他几种IO以及在Java中的应用。 阻塞、非阻塞、同步、异步以及IO多路复用 在进行网络IO的时候会涉及到用户态和内核态,并且在用户态和内核态之间会发生数据交换,从这个角度来说我们可以把IO抽象成两个阶段:1、用户态等待内核态数据准备好,2、将数据从内核态拷贝到用户态。之所以会有同步、异步、阻塞和非阻塞这几种说法就是根据程序在这两个阶段的处理方式不同而产生的。 同步阻塞 当在用户态调用read操作的时候,如果这时候kernel还没有准备好数据,那么用户态会一直阻塞等待,直到有数据返回。当kernel准备好数据之后,用户态继续等待kernel把数据从内核态拷贝到用户态之后才可以使用

05-01 爬虫高性能相关

寵の児 提交于 2019-12-06 01:12:22
05-01 爬虫高性能相关 一 背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能继续下一个,效率会非常低。 需要强调的是:对于单线程下串行N个任务,并不完全等同于低效,如果这N个任务都是纯计算的任务,那么该线程对cpu的利用率仍然会很高,之所以单线程下串行多个爬虫任务低效,是因为爬虫任务是明显的IO密集型程序。 关于IO模型详见 链接:http://www.cnblogs.com/linhaifeng/articles/7454717.html 那么该如何提高爬取性能呢?且看下述概念 二 同步、异步、回调机制 1、同步调用:即提交一个任务后就在原地等待任务结束,等到拿到任务的结果后再继续下一行代码,效率低下 同步调用 2、一个简单的解决方案:多线程或多进程 #在服务器端使用多线程(或多进程)。多线程(或多进程)的目的是让每个连接都拥有独立的线程(或进程),这样任何一个连接的阻塞都不会影响其他的连接。 多进程或多线程 该方案的问题是: #开启多进程或都线程的方式,我们是无法无限制地开启多进程或多线程的:在遇到要同时响应成百上千路的连接请求,则无论多线程还是多进程都会严重占据系统资源,降低系统对外界响应效率,而且线程与进程本身也更容易进入假死状态。 3、改进方案: 线程池或进程池

IO概念和五种IO模型

霸气de小男生 提交于 2019-12-05 22:53:47
一、什么是IO? 我们都知道unix世界里、一切皆文件、而文件是什么呢?文件就是一串二进制流而已、不管socket、还是FIFO、管道、终端、对我们来说、一切都是文件、一切都是流、在信息交换的过程中、我们都是对这些流进行数据的收发操作、简称为I/O操作(input and output)、往流中读出数据、系统调用read、写入数据、系统调用write、不过话说回来了、计算机里有这么多的流、我怎么知道要操作哪个流呢?做到这个的就是文件描述符、即通常所说的fd、一个fd就是一个整数、所以对这个整数的操作、就是对这个文件(流)的操作、我们创建一个socket、通过系统调用会返回一个文件描述符、那么剩下对socket的操作就会转化为对这个描述符的操作、不能不说这又是一种分层和抽象的思想。 二、IO交互 通常用户进程中的一个完整IO分为两个阶段: 用户空间<------------->内核空间、 内核空间<------------->设备空间、 内核空间中存放的是内核代码和数据、而进程的用户空间中存放的是用户程序的代码和数据、不管是内核空间还是用户空间、它们都处于虚拟空间中、Linux使用两级保护机制:0级供内核使用、3级供用户程序使用、 操作系统和驱动程序运行在内核空间、应用程序运行在用户空间、两者不能简单地使用指针传递数据、因为Linux使用的虚拟内存机制

磁盘测试工具FIO

假装没事ソ 提交于 2019-12-05 18:17:07
目前主流的第三方IO测试工具有fio、iometer和Orion,这三种工具各有千秋。 fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的IO测试软件,可在没有安装oracle数据库的情况下模拟oracle数据库场景的读写。 如下是在Linux系统上采用fio工具来对SAN存储进行的IO测试。 1、安装fio 在fio官网下载fio-2.1.10.tar文件,解压后./configure、make、make install之后就可以使用fio了。 2、fio参数解释 FIO工具使用方法: 参数说明: filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。 direct=1 测试过程绕过机器自带的buffer。使测试结果更真实。 rw=randwrite 测试随机写的I/O rw=randrw 测试随机写和读的I/O bs=16k 单次io的块文件大小为16k bsrange=512-2048 同上,提定数据块的大小范围 size=5g 本次的测试文件大小为5g,以每次4k的io进行测试。 numjobs=30 本次的测试线程为30. runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。 ioengine=psync io引擎使用pync方式

Pipe——高性能IO(二)

本小妞迷上赌 提交于 2019-12-05 17:32:23
Pipelines - .NET中的新IO API指引(一) Pipelines - .NET中的新IO API指引(二) 关于 System.IO.Pipelines 的一篇说明 System.IO.Pipelines: .NET高性能IO System.IO.Pipelines 是对IO的统一抽象,文件、com口、网络等等,重点在于让调用者注意力集中在读、写缓冲区上,典型的就是 IDuplexPipe中的Input Output。 可以理解为将IO类抽象为读、写两个缓冲区。 目前官方实现还处于preview状态,作者使用Socket和NetworkStream 实现了一个 Pipelines.Sockets.Unofficial 作者在前两篇中提到使用System.IO.Pipelines 改造StackExchange.Redis,在本篇中作者采用了改造现有的SimplSockets库来说明System.IO.Pipelines的使用。 文章中的代码 ( SimplPipelines, KestrelServer ) ## SimplSockets说明 + 可以单纯的发送(Send),也可以完成请求/响应处理(SendRecieve) + 同步Api + 提供简单的帧协议封装消息数据 + 使用byte[] + 服务端可以向所有客户端广播消息 + 有心跳检测等等

NodeJs异步IO

送分小仙女□ 提交于 2019-12-05 15:43:41
一、异步的应用 对于前端开发人员来说,异步编程再普遍不过了(ajax)。 对于服务端(java)开发人员来说,也存在异步编程,相关编写可参见Java分类下的“java编写异步处理方法提升系统性能”该篇文章,这里也就不放传送门了。 对于移动端所有的触发事件也都是异步的,相关开发人员应该也都是很熟悉的。 二、异步和同步的比较 在java中如果需要发起网络请求,假设我们已经封装好了一个方法,如下: Log .log ( "发起网络请求" ) ; JSONObject result1 = HttpUtil .get ( "http://host:port/uri1" ) ; Log .log ( "网络请求1返回内容:" + result1 .toString ()) ; JSONObject result2 = HttpUtil .get ( "http://host:port/uri2" ) ; Log .log ( "网络请求2返回内容:" + result2 .toString ()) ; // do something... 以上代码是顺序执行的,也就是说网络情况很差的环境下,后续的操作(do something…)就算与网络请求返回结果无关也必须要等待。 下图说明一下同步IO的执行顺序: 所以以上代码的总用时=网络请求1的用时时长+网络请求2的用时时长

Node学习基础(一) 之了解nodejs

一笑奈何 提交于 2019-12-05 15:24:50
1. Node.js是什么? node.js是用于开发服务器,做数据API,设计路由...等 和前端的主要区别在于:前端主要负责效果和交互 2.Node.js是追求极致的产物 I,是单线程!!! 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。 而一个进程又是由多个线程所组成的。 什么是线程? 线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的, 即不同的线程可以执行同样的函数。 什么是多线程? 多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务, 也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。 单线程 每个正在运行的程序(即进程),至少包括一个线程,这个线程叫主线程 主线程在程序启动时被创建,用于执行main函数 只有一个主线程的程序,称作单线程程序 主线程负责执行程序的所有代码(UI展现以及刷新,网络请求,本地存储等等)。这些代码只能顺序执行,无法并发执行 单线程较多线程来说,系统稳定、扩展性极强、软件丰富 。多用于点对点 的服务。 单线程就是一心一意,用情专一的痴情少年,多线程则相反。 单线程 就是进程只有一个线程。 多线程与单线程的区别 生活举例 你早上上班,正要打卡的时候,手机响了。。你如果先接了电话,等接完了,在打卡