☆─────────────────────────────────────☆
shipu (lagrange) 于 (Tue Oct 14 16:42:57 2008) 提到:
我在写一个网页游戏。
如果登录的用户每隔一秒钟刷新一次来实现游戏中的交互
用数据库更高效还是直接fopen文件更高效?
一台普通的服务器,每秒钟能处理多少个数据库操作(假设用mysql)?
☆─────────────────────────────────────☆
creese (想当年太阳系还有9大行星) 于 (Tue Oct 14 17:03:39 2008) 提到:
在内存里操作最靠谱
☆─────────────────────────────────────☆
shipu (lagrange) 于 (Wed Oct 15 01:30:40 2008) 提到:
怎么实现? 两个用户可以通过服务器的内存交互吗?
感觉文件操作的话,服务器的操作系统应该会在一定程度上自动使用内存.不知道mysql怎样?
呼唤大牛
☆─────────────────────────────────────☆
shipu (lagrange) 于 (Wed Oct 15 01:49:52 2008) 提到:
我的数据库核心部分的表不算太大,估计<10m
不知道有没有办法让服务器自动把这个表完全放在磁盘里操作?还是说mysql本来就会这样做...
谁写过网页游戏,江湖,聊天室之类的呀?
☆─────────────────────────────────────☆
shipu (lagrange) 于 (Wed Oct 15 02:21:36 2008) 提到:
刚刚上网baidu了一下,发现一个好东西叫"php共享内存"
打算试一下,似乎可以解决我的问题
☆─────────────────────────────────────☆
Mikov (Mikov Chain) 于 (Wed Oct 15 10:24:58 2008) 提到:
这么搞不现实的, 一台服务器在线600人, 不带数据库裸web访问都能搞死你, 换思路吧
参考travian
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Wed Oct 15 10:25:47 2008) 提到:
不带数据库,600人也不算啥吧?
☆─────────────────────────────────────☆
Mikov (Mikov Chain) 于 (Wed Oct 15 10:57:50 2008) 提到:
看清楚, 不是5分钟600人在线, 是每秒600个线程, 要不你找台服务器试试?
一个每天100万PV的站, 用top看峰值也不过400~500个线程, 那就快到一个四核的临界状态了, 只要有一个mysql查询阻塞一下, 服务立马挂掉.
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Wed Oct 15 11:06:41 2008) 提到:
在线并不一定都在运行吧?
☆─────────────────────────────────────☆
shaolin (叶孤城 | 新婚燕尔) 于 (Wed Oct 15 11:10:00 2008) 提到:
说的是并发,
服务器同时处理600个线程,不是您说的那种,打开网页就算在线。
☆─────────────────────────────────────☆
mpyu (猫扑老鱼) 于 (Wed Oct 15 11:13:37 2008) 提到:
少说几句啦.
每秒600还用多线程模型简直找死
直接死查mysql就更找死了.
那个,你得用数据库,封装一层查询缓存,用户状态什么的塞到内存里
还有比较耗时但是常用的查询,查出来md5一下当key,塞到内存里cache住.
试试libmemcached吧.挺好用的.用文件的方式可以做的很好,但是比较难.
最好还是别玩火了.
这个,和你程序息息相关阿,写几行破屁爱吃屁代码,动辄就select * from user
别说mysql了,oracle一样死的很难看.
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Wed Oct 15 11:15:23 2008) 提到:
线程很可能是在sleep呢
☆─────────────────────────────────────☆
creese (想当年太阳系还有9大行星) 于 (Wed Oct 15 11:41:32 2008) 提到:
只是扛连接用non-blocking 的 epoll/kqueue
双C 4核的机器同时对付10万个TCP连接不在话下,
就算用non-blocking select模型,同时对付5万个TCP连接也是没有问题的
不过在这种模式下要把数据库的逻辑嵌入服务进程比较费时
这种本来大多数的数据都不要持久化的应用,还是直接在内存里面倒腾比较爽
☆─────────────────────────────────────☆
mpyu (猫扑老鱼) 于 (Wed Oct 15 12:25:12 2008) 提到:
这个,吹的过头了...
这个,吹的更过头了...
这倒是实话.
☆─────────────────────────────────────☆
shipu (lagrange) 于 (Wed Oct 15 12:26:39 2008) 提到:
我是楼主。谢谢楼上几位的回复。。
我在做网页游戏,(只是个demo,希望能通过这个学点儿东西,为求职加筹码)
目前的想法是:
前端静态页通过ajax刷一段php脚本(每秒一次),php脚本读写一段共享内存。
后台一个脚本程序定期备份共享内存中的数据到mysql
这样的话,如果500人同时在线,相当于每秒请求500个php页(内存操作)
当然我只是在做demo 应该不会有那么多人在线的
共享内存的命令叫shmop,不知这个命令效率如何。
不知道以前那些做江湖和聊天室的怎样处理,大家有无其他的建议?
☆─────────────────────────────────────☆
shipu (lagrange) 于 (Wed Oct 15 12:28:38 2008) 提到:
大家提到的“在内存里倒腾”是不是指shmop?
还是有其他的办法实现?
☆─────────────────────────────────────☆
mpyu (猫扑老鱼) 于 (Wed Oct 15 12:29:14 2008) 提到:
共享内存这东西,折腾起来挺别扭的
前后台通讯可以用xmlrpc,虽然效率低点,但是简单有效.
再就是写个简单的ice application也灰常好使.
阿,扯远了,你既然是做demo的话,就这样做就可以.
甭管什么效率不效率了,刚出校门的学生,能把功能做的ok
就很难得了...
☆─────────────────────────────────────☆
shipu (lagrange) 于 (Wed Oct 15 12:32:33 2008) 提到:
似乎还可以用php写socket?
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Wed Oct 15 12:34:12 2008) 提到:
不知道你这个“相当于”是怎么推理出来的
☆─────────────────────────────────────☆
mpyu (猫扑老鱼) 于 (Wed Oct 15 12:35:00 2008) 提到:
google "memcached"
其实,满足你初衷的话,完全不用考虑效率.
还是先把功能实现好吧...
☆─────────────────────────────────────☆
shipu (lagrange) 于 (Wed Oct 15 12:37:14 2008) 提到:
果然老猫。谢。我先查一查你说的这两个名词什么意思。。
其实主要是要解决不同用户的php脚本互相通讯,因为每个用户要实时得到其他用户在游戏中的操作
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Wed Oct 15 12:39:49 2008) 提到:
小时候我用ASP,ASP直接提供一个application对象
PHP据说没有,所以得自己写了
其实memcache也可以作为一种RPC手段
☆─────────────────────────────────────☆
shipu (lagrange) 于 (Wed Oct 15 12:40:10 2008) 提到:
你是说会比500个php请求更多还是更少?
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Wed Oct 15 12:41:14 2008) 提到:
1 在线不一定要访问php。在线是一个时间段的概念
2 访问php也不一定同时
3 同时访问也不一定同时执行
4 同时执行还会block呢
500个其实不算啥
☆─────────────────────────────────────☆
mpyu (猫扑老鱼) 于 (Wed Oct 15 12:44:45 2008) 提到:
互相通讯阿,你这样,就用xmlrpc,因为这个简单阿...
后面架个server,和前台通讯....你会C/C++不? 会的话轻松太多了
这也忒不靠谱了,重要数据咋能扔memcache里呢
memcache相当于摸奖,我手气不错,摸到了,就省许多事
摸不着,是正常的,一锄头一镐头的干吧...
他那需求,根本不用啥性能,折腾着把功能完成了
毙业找工作,一堆公司都能进.
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Wed Oct 15 12:45:57 2008) 提到:
我记得好像某改版memcached,MISS之后会自动去后端存储查询数据
对于聊天室、网游这种,其实运行时数据占多数。需要存盘的没多少吧
☆─────────────────────────────────────☆
shipu (lagrange) 于 (Wed Oct 15 12:51:37 2008) 提到:
哦,那不错。我查查看。。。
其实确实我不需要考虑太多效率的问题,现在我全是用mysql实现的,自己和朋友测试效果还好。
不过有个好的架构可以事半功倍,二来也可以学不少东西嘛。今天就看到不少新名词
恩,回去继续写代码了,感谢两位前辈
☆─────────────────────────────────────☆
mpyu (猫扑老鱼) 于 (Wed Oct 15 12:53:26 2008) 提到:
这个功能是数据层应该做的,属于查询缓存,而且我得能控制这个缓存.
必要的时候把它清掉,这么玩,上来就patch memcached,简直没脑子...
网游不是很了解,聊天室做过,的确不用时时存盘,写个http server,内存
里面维护几张表,就搞定了,有一个专门的线程,定时把数据同步到db里面.
ps:挺土的,我知道,但是在本世纪初,还没有分布的概念呢....
☆─────────────────────────────────────☆
creese (想当年太阳系还有9大行星) 于 (Wed Oct 15 13:13:11 2008) 提到:
厄 一个简单的逻辑
扛HTTP的连接 用sendfile往外吐文件
自己写个小daemon在实际应用环境下跑跑就知道了
8月份的时候因为有一个实际的业务得用一个遗留下来的用select io的程序
去布一个比较大的集群 实际跑起来得同时维持300万个TCP连接的样子吧 单机的表现比
我开始估计的好不少
☆─────────────────────────────────────☆
mpyu (猫扑老鱼) 于 (Wed Oct 15 13:17:53 2008) 提到:
我最近一年大概写了七八个epoll()+sendfile()的破烂server
其中httpd也有,性能啥样,还是比较有数的.
300万连接,Orz,你fd最大65535吧.
☆─────────────────────────────────────☆
sly9 (-_-b) 于 (Wed Oct 15 13:19:07 2008) 提到:
这个……太夸张了吧……
apache每秒处理个上k的请求都挺吃力了……
你这个几万个连接得怎么处理啊……
☆─────────────────────────────────────☆
creese (想当年太阳系还有9大行星) 于 (Wed Oct 15 13:22:48 2008) 提到:
哦 反正刚看了看 这种server往外吐文件每秒吃掉个300Mb的带宽还是靠谱的
CPU的资源占的很少
俺的机器的fd都得放大到20万的 而且肯定是集群来扛阿
accept下来的连接不受那个2^16的端口数量的限制阿
☆─────────────────────────────────────☆
creese (想当年太阳系还有9大行星) 于 (Wed Oct 15 13:26:38 2008) 提到:
apache的性能在各类HTTPD里面应该是属于最差劲的那一类的
☆─────────────────────────────────────☆
mpyu (猫扑老鱼) 于 (Wed Oct 15 13:26:53 2008) 提到:
吃满300M这个好说,但是你server这性能,凭我对epoll()+sendfile()的了解
...还是觉得不可思议,能说说你这server是干啥用的么,什么机器,只是往外吐
文件? 没有其余的处理了么,比如说需要加工一下往外writev点东西之类的.
这个我同意.
☆─────────────────────────────────────☆
creese (想当年太阳系还有9大行星) 于 (Wed Oct 15 13:34:09 2008) 提到:
简单的东西 稍稍解析以下HTTP头然后返回个头 把文件扔出去
程序accept下来的fd会涉及到点扔给那个线程用的问题
而且我说的是同时维持的连接数量阿 不是每秒并发
☆─────────────────────────────────────☆
mpyu (猫扑老鱼) 于 (Wed Oct 15 13:37:17 2008) 提到:
也就是说,支持动态请求了? 静态的直接open以后sendfile
动态的收下来以后扔进线程池去,处理完了writev,是这么玩的不?
有这句,感觉靠谱些了...
☆─────────────────────────────────────☆
creese (想当年太阳系还有9大行星) 于 (Wed Oct 15 13:43:20 2008) 提到:
不处理动态的阿 只是说有和CPU数量相关的多个线程都会往外吐东西
这种server里面如果要跑一些具体的业务逻辑我一直是觉得不太对路
如果是指瞬发连接的话,每秒种来个10万个HTTP请求需要考虑的是这个IDC的
基础设施能不能吃下来.....
☆─────────────────────────────────────☆
suchasplus (誓死捍卫NAZI) 于 (Wed Oct 15 16:42:01 2008) 提到:
最终幻想webgame单服务器5K在线基本没有问题
我看过水色管理员给我的php+mysql源代码,觉得也就是那么回事
☆─────────────────────────────────────☆
IDKilled (杀人?还是被杀?这是一个问题) 于 (Wed Oct 15 22:07:56 2008) 提到:
你显然没有明白游戏在线500人是什么概念.
☆─────────────────────────────────────☆
IDKilled (杀人?还是被杀?这是一个问题) 于 (Wed Oct 15 22:09:34 2008) 提到:
游戏与游戏不同
人与人弈不同
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Wed Oct 15 22:17:49 2008) 提到:
网页游戏!!
☆─────────────────────────────────────☆
IDKilled (杀人?还是被杀?这是一个问题) 于 (Wed Oct 15 22:19:26 2008) 提到:
明白同时在线的意思吗?
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Wed Oct 15 22:20:36 2008) 提到:
网页所谓在线,和开着一个tcp连接是俩概念
☆─────────────────────────────────────☆
IDKilled (杀人?还是被杀?这是一个问题) 于 (Wed Oct 15 22:28:21 2008) 提到:
呵呵.所以说你是错误的.
楼主的问题是要求500人同时在线.就是同时能被通知到.
在网页下有两种办法,一种是利用服务器常连接,不断PUSH数据到客户端.
一种是利用客户端不断的请求,这种请求基本上是实时的请求,每过几秒请求一次,如果是一秒一次请求,那么500人在线相当于每秒500PV.
可明白?不是你所理解的网页的在线.
前一种实际上就是TCP连接,但是开销比TCP的大一点.
后一种开销更大,不推荐使用.
☆─────────────────────────────────────☆
nullgate (空门·恨只恨我们家鬼害家神) 于 (Thu Oct 16 08:54:09 2008) 提到:
战略类的 web game 其实还好
☆─────────────────────────────────────☆
sayinger (言者) 于 (Thu Oct 16 08:58:18 2008) 提到:
回合制吧,即时战略类不一样
☆─────────────────────────────────────☆
GunRock (江山易改) 于 (Thu Oct 16 09:29:01 2008) 提到:
没有这种东西吧,哪能这种通用的。
☆─────────────────────────────────────☆
GunRock (江山易改) 于 (Thu Oct 16 09:31:02 2008) 提到:
apache 再差处理个上k还是可以的,你再试试 nginx 之类的,目前的普通 desktop pc 轻松上 12k
☆─────────────────────────────────────☆
GunRock (江山易改) 于 (Thu Oct 16 09:32:36 2008) 提到:
开着一个 tcp 也没什么打不了的,没有什么杀人的含义
☆─────────────────────────────────────☆
kobe2000 (最后的机会) 于 (Thu Oct 16 09:39:12 2008) 提到:
web怎么搞即时战略?
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Thu Oct 16 09:40:36 2008) 提到:
前者,php会超出规定运行时间的
☆─────────────────────────────────────☆
shaolin (叶孤城 | 新婚燕尔) 于 (Thu Oct 16 10:16:06 2008) 提到:
没看过js版的sc ?
☆─────────────────────────────────────☆
beaver9 (偶像是朱茵) 于 (Thu Oct 16 10:57:30 2008) 提到:
你估计一下 IO 到底有多大负载吧
数据库的好处是可以分散在不同的机器上,可扩展性好些。而且很多操作会变得简单些。
直接搞文件的也能做的不错,看具体应用了。
你只要找一个可用的方案就成了,不用找最优的吧。
☆─────────────────────────────────────☆
Mikov (Mikov Chain) 于 (Thu Oct 16 11:23:54 2008) 提到:
今天来一看没想到都顶到三页了
我所说的情况是基于楼主的"登录的用户每隔一秒钟刷新一次", JulyClyde就不要再较劲了, 你维护个每天PV>1000k的站之后你自然会理解.
如果用tcp连接, 600对于单服务器是小case, 但是写起程序来就是另一套东东了, 不是主流的web模式.
另外我也不赞成 "先实现功能, 再进行优化" 的观点.
如果只是自己玩, 怎么搞都可以. 但如果是商业产品, 在上线后发现瓶颈, 扩充到硬件和资金的极限之后你就会非常痛苦, 换一个架构的代价太大了.
所以首先你要预计访问规模, 定下程序模型后再开始开发. 楼主在现阶段考虑这个问题是正确的.
这个话题蛮有意思, 版上还是有一批高手的.
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Thu Oct 16 11:37:42 2008) 提到:
我们的现在就1000多KPV啊。只是类型不同而已。我们的是www论坛
☆─────────────────────────────────────☆
kobe2000 (最后的机会) 于 (Thu Oct 16 11:41:06 2008) 提到:
哪里有啊?能有那么快的响应速度么?
☆─────────────────────────────────────☆
Mikov (Mikov Chain) 于 (Thu Oct 16 11:49:56 2008) 提到:
什么论坛, 引见一下?
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Thu Oct 16 11:51:05 2008) 提到:
www.5d6d.com
☆─────────────────────────────────────☆
Mikov (Mikov Chain) 于 (Thu Oct 16 12:01:56 2008) 提到:
原来是DZ的人, 幸会幸会. 有些关于论坛程序的问题以后可以请教一下.
☆─────────────────────────────────────☆
Nefarius (仡俅仲供仲佒償俄佲伡儫侘儬倿) 于 (Thu Oct 16 12:28:24 2008) 提到:
这个站为啥把我以前申请的帐号干掉了。。。
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Thu Oct 16 12:29:54 2008) 提到:
我不懂程序
☆─────────────────────────────────────☆
Mikov (Mikov Chain) 于 (Thu Oct 16 14:34:11 2008) 提到:
哦
☆─────────────────────────────────────☆
antijp (antijp) 于 (Thu Oct 16 14:35:51 2008) 提到:
我稍微测试了一下,如果在 AF_INET 5000 个左右的 socket,用 select(2) 处理一次要花费大约 0.2 秒。
如果你这 5 万个 TCP 连接都是在同一个进程里面,那么,select(2) 至少要花上几秒才能扫描一次整个 fd_set 以决定某个 fd 是否要被 set。
我不知道你怎么能忍受这么大的延迟。或者你的应用上面负载根本就很小。
☆─────────────────────────────────────☆
antijp (antijp) 于 (Thu Oct 16 14:36:55 2008) 提到:
Apache 对于静态请求处理起来一点也不吃力,只要你的 CPU 跟得上。而且在多核处理器上,Apache 每秒甚至可以比 lighttpd 完成更多的请求。
☆─────────────────────────────────────☆
antijp (antijp) 于 (Thu Oct 16 14:37:26 2008) 提到:
CPU 比较少的机器上是这样,但是 CPU 数量一上去,你再看看是 lighttpd 快还是 Apache 快。
☆─────────────────────────────────────☆
creese (想当年太阳系还有9大行星) 于 (Thu Oct 16 14:59:38 2008) 提到:
一个核上跑20K FD是没有问题的,不知道你用的什么CPU测试的,我这里用N年前的P3 1G
的机器跑都没这么夸张,而且现在的机器都是4核的了。。。,在non-blocking的状态下
应用都是很简单的东西,基本上都是操作内存
☆─────────────────────────────────────☆
creese (想当年太阳系还有9大行星) 于 (Thu Oct 16 15:00:02 2008) 提到:
light在SMP下好像不怎么样
nginx好很多
☆─────────────────────────────────────☆
JulyClyde (十月有点冷,还是七月好) 于 (Thu Oct 16 15:02:11 2008) 提到:
nginx是多进程
☆─────────────────────────────────────☆
suchasplus (誓死捍卫NAZI) 于 (Thu Oct 16 15:09:39 2008) 提到:
嘿嘿
虽然lighty有很多很多bug
但是应付纯静态请求尤其是小文件。。。嘿嘿
ab一下就知道了
☆─────────────────────────────────────☆
suchasplus (誓死捍卫NAZI) 于 (Thu Oct 16 15:10:17 2008) 提到:
smp下可以多开
官方文档有写
☆─────────────────────────────────────☆
sayinger (言者) 于 (Thu Oct 16 15:45:12 2008) 提到:
http://xingji.siyun.org.cn/,哈哈
☆─────────────────────────────────────☆
antijp (antijp) 于 (Thu Oct 16 16:23:10 2008) 提到:
FreeBSD 7.0-RELEASE amd64
Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz (2414.50-MHz K8-class CPU)
☆─────────────────────────────────────☆
antijp (antijp) 于 (Thu Oct 16 16:24:32 2008) 提到:
lighttpd 在 FreeBSD 下打开 SMP 支持对于静态文件一点帮助都没有。
nginx 没试过。
☆─────────────────────────────────────☆
antijp (antijp) 于 (Thu Oct 16 16:27:22 2008) 提到:
空文件够小了吧?
你找个 4 核的机器跑跑看
☆─────────────────────────────────────☆
antijp (antijp) 于 (Thu Oct 16 16:28:12 2008) 提到:
在 FreeBSD 下面,打开 lighttpd 的 SMP 支持只会导致性能下降……
☆─────────────────────────────────────☆
antijp (antijp) 于 (Thu Oct 16 16:50:03 2008) 提到:
我搞错了,之前我计算的是整个程序的运行时间,包括了 connect(2) 在内。所以 0.2 秒比正常的时间大了两个数量级。
我重新计算了在 5000 个 socket 上 select(2) 的时间,大概是 3ms 左右。貌似也可以接受了……
☆─────────────────────────────────────☆
IDKilled (杀人?还是被杀?这是一个问题) 于 (Thu Oct 16 22:11:41 2008) 提到:
php的超时可以设置的.
我还用PHP做用服务器.
没有什么的.同学.
☆─────────────────────────────────────☆
nullgate (空门·恨只恨我们家鬼害家神) 于 (Fri Oct 17 00:04:28 2008) 提到:
问个问题,你真的写个游戏服务器,混过网络游戏这一行么?
☆─────────────────────────────────────☆
cornstalk (曾忆相濡以沫) 于 (Fri Oct 17 00:05:18 2008) 提到:
看完了所有的re,居然没有人提到ErLang。
☆─────────────────────────────────────☆
nullgate (空门·恨只恨我们家鬼害家神) 于 (Fri Oct 17 00:12:26 2008) 提到:
这个就跟网页游戏差得更远了
☆─────────────────────────────────────☆
mpyu (猫扑老鱼) 于 (Fri Oct 17 07:01:16 2008) 提到:
哇,空门大师发话了.....
☆─────────────────────────────────────☆
Mikov (Mikov Chain) 于 (Fri Oct 17 09:55:55 2008) 提到:
写过,没混过, 因为我主业不是这个, 大半年不做研发了, 现在偶尔写代码也只是改些东西. 如果说玩的话, 那倒是玩的不少.
web游戏以travian为参考做过一两个, 不知道空门想问什么?
☆─────────────────────────────────────☆
creese (想当年太阳系还有9大行星) 于 (Fri Oct 17 10:33:56 2008) 提到:
light的架构在SMP上表现一直很差
nginx好很多 毕竟从最开始就是按多进程的模式设计得
☆─────────────────────────────────────☆
cornstalkII (时间的战旗!) 于 (Fri Oct 17 17:25:08 2008) 提到:
空门看来对ErLang的应用领域不了解啊。