- 博客(18)
- 资源 (3)
- 收藏
- 关注
原创 搭建一个后台服务器--服务端代码(异步,大并发)
#include #include #include #include #include #include #ifndef WIN32#include #include #include #include #include #include #else#include #define close( f ) closesocket( f )#endifstruc
2013-03-31 20:05:04 5442 10
原创 搭建一个后台服务器--服务端(异步,大并发)
上篇的阻塞模式下服务器的并发只有几K,而真正的server 像nginx, apache, yumeiz 轻轻松松处理几万个并发完全不在话下,因此大并发的场合下是不能用阻塞的。1W的并发是一个分隔点,如果单进程模型下能达到 的话,说明至少在服务器这块你已经很厉害了。服务器开发就像一门气功,能不能搞出大并发,容错性处理得怎么样,就是你有没有内功,内功有多深。异步模式是专门为大并发
2013-03-31 18:31:42 7451 6
原创 搭建一个后台服务器--服务端(阻塞)
为什么 要在标题后面加个“阻塞”呢,因为系统为了增大并发,减小等待(阻塞),建立了另一种事件模式,后文将介绍,这里只介绍阻塞的模型。阻塞服务器要干的事大致可以分为以下几步:1.创建服务端监听连接2.产生用户连接3.接收用户请求4.发送返回给用户敲码过程如下:设置监听地址与端口: addr_server.sin_family = AF_INET; add
2013-03-31 17:52:41 3829 2
原创 搭建一个后台服务器--客户端
上篇规定的协议请求部分:request:username/password, 约定username与password 各占32个字节(联同末位0)可以将客户端的逻辑设计成:1.将username,password 封装进buffer2.连接服务端3.发送buffer4.接收二进制的系统当前时间 5.显示时间 代码如下:服务
2013-03-31 14:08:51 4872 1
原创 搭建一个后台服务器--引子
最近去了几家公司面试,有一些大公司(比如企鹅)的考核内容真心弱智,考的都是些算法,尼玛,拿一个刚毕业的学生来做说不定也可以过的,看来本来就不是在招搞服务器的,举个例子,企鹅多个部门都曾出的一道题:如何知道集合A,B中的相关性。意思就是哪些元素在A,B之中都有,哪些元素在A,B中不都出现。其实解法很简单,学过算法的完全可以做到 。我们知道集合具有互异性,就是集合中的元素只能出现一次,可以建一
2013-03-31 11:42:55 3947 4
原创 服务器技术的发展方向
技术永远是服务于产品的,产品则是服务于大环境的,在目前的大环境下,大部分服务器找载着以下几类服务:小站,以asp/jsp/php最具代表型.门户网站,如 qq新闻/163视频网站,如youku/kankan电商网站, 如淘宝娱乐软件后台,如微信,微博我们看看区别小站永远离不开虚拟机,国内那些坑爹的空间提供商哪会给你整台服务器。后面几种才运行于独立的服务器。
2013-03-25 15:37:46 3814 5
原创 大并发服务器不得不说的技术--connect 异步
前面我们谈的大多是服务端与客户端的技术,服务器开发其实有时还会涉及到跨服务器的访问,比如腾讯的拍拍服务器需要知道登录的会员信息,就需要访问会员服务器。跨务器访问会涉及到很多的技术,比如访问权限控制,数据同步等,这里主要来学习一下传输层。为了更容易理解,我们将访问端服务器称为客户端,被访问端服务器称为服务端。客户端发起一个连接的过程:socket_fd = socket( A
2013-03-21 04:05:48 3713 5
原创 大并发服务器不得不说的技术--http 缓存
前面所说技术订都是服务器端一个人在努力,有时候也需要客户端配合。一个链接请求过程大致可以分成几个阶段如果客户端发送同样的请求,且结果都一样,我们是不是可以缓冲一下呢?是不是可以减少几步呢? 的确可以,一般来说以下几种方法:1.我们先试着在服务端进行缓冲,我们试着将一个已经返回的长链接发送内容不作释放,下次请求时直接返回刚才发送的内容,这个不适用于频繁访问,适
2013-03-20 16:10:04 3484
原创 大并发服务器不得不说的技术--writev
前面我们说过,对于静态文件的传输,用sendfile可以减少系统调用,现在我们看看动态的数据应该如何处理。首先,如果数据足够小(小于1024)且只有唯一的一个buffer,我们直接用 send/write 就可以了。通常的情况下,程序可能会在多个地方产生不同的buffer,如 nginx,第一个phase里都可能会产生buffer,放进一个chain里,如果对每个buffer调用一次s
2013-03-20 11:26:58 8784 2
原创 大并发服务器不得不说的技术--tcp cork
如果把tcp当成服务端与客户端的管道,cork 就是给管道加个塞子。为什么 要加个塞子呢?先来举个例子:int times = 10;while( times--){ send( sock_fd, buf, 1, 0 )}这段program会发送数据10次,每次就发送1个字节,这样会不会什么问题呢?记得以前农忙的时候,田里的稻子收割完了,要打成
2013-03-17 08:36:54 3638 3
原创 大并发服务器不得不说的技术--sendfile
socket发送函数。int send( SOCKET s, const char FAR *buf, int len, int flags );如果内容是动态生成的,一般是把传输内容直接丢给buf中用send函数传输,没有优化的空间。文件传输则要先把内容read到buf中,因此至少两次内核调用,如果文件很大,可能会用一个循环调用,如:while( size == P
2013-03-16 18:11:51 3069
原创 什么样的服务器才能叫做大并发
我觉得服务器在成为大并发前,首先要能承受住大并发的压力,无论能否正常返回,首先不能崩溃。apache和nginx是两个出名的服务器,先来分析一下它们。大量用户访问的时候,apache会创建大量的进程数,吃掉大量的内存,而nginx内存这块做得很好,不过这也是nginx的瓶颈所在。所谓有内存就是给你花的,你不花怎么对得起服务器呢,何况现在的服务器一般都是高配。快速响应与内存大小其实是
2013-03-13 15:40:50 4925 10
原创 epoll 事件处理的细节分析2
准确的说epoll事件就是IO事件,包括文件、socket、pipe等,linux把他们统称为文件,统一的接口调用,驱动层不同实现。这里分成四类:监听套餐接字,链接套接字,文件,pipe,相应的触发条件1.监听套接字:有新链接连上临听套接字,并三次握手成功时2.链接套接字有IO读写,且传输层接收/发送完毕3.普通文件有IO读写4.pipe有IO读写,且有锁保
2013-03-13 12:13:42 2561 1
原创 epoll 事件处理的细节分析
先来纠正一下观念。epoll 是区分读写事件,这主要取决于底层驱动的支付。如:struct epoll_event ee;ee.events= EPOLLIN | EPOLLOUT;epoll_ctl( epfd, EPOLL_CTL_MOD, fd, &ee );等来事件可读的时候epoll_wait 返回的 ee.events 就会是 EPOLLIN可写
2013-03-13 11:23:21 2048
原创 epoll 事件处理的技术内核分析
epoll高效机制其实就是内核回调,我们知道linux把socket也是当成file处理的,只是底层驱动不一样。先来看看内核文件结构:struct file_operations { struct module *owner; loff_t (*llseek) (struct file *, loff_t, int); ssize_t (*re
2013-03-13 11:00:06 2608
原创 对于nginx的思考2---事件处理
nginx的事件处理函数ngx_process_events_and_timers,linux上最终会调用 ngx_epoll_process_events。之后epoll_wait 后得到相应的事件,再做相应的处理,即监听与处理是在同一个线程中处理的,这样会有几个问题:1.如果有多个事件,必须等待上一个事件处理完毕才能处理下一个。2.同一个connection,只能按”接收-发送-接
2013-03-12 12:08:22 1852 1
原创 对于nginx的思考
作为轻理级web server,nginx的优势明显,尤其是对反向代理,负载均衡的处理。nginx对IO用filter模型实现gzip的处理,可以新增filter,增删模块。开发人员对于nginx的模块开发热情,似乎有渐涨的趋势,国内最出名的要算taobao了,开发了了很多模块(http://openresty.org)。但是模块多了,用的人维护起来也是一个麻烦事,也偏离了nginx的
2013-03-12 11:25:24 2104
原创 epoll 处理并发的一些想法
首先,epoll 是线程安全的,系统调用的底层有锁保护。这就意味着,多线程处理的可行性:线程A监听,线程B负责处理,当A线程 accept 一个 socket后传递给B,B处理完后,可以直接关掉socket,并调用 epoll_ctl 来取消A线程与socket的关联。考虑到并发性,可以建立监听线程池C与处理线程池D。考虑到业务的无关联性,可以为connection建立小的生命周期
2013-03-12 11:02:39 2449
服务器端代码(异步,大并发)
2013-03-31
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人