librelist archives

« back to archive

monserver 上传大文件时,CPU负载高的问题

monserver 上传大文件时,CPU负载高的问题

From:
free
Date:
2012-05-09 @ 09:05
经过几天的不断跟踪mongserver源代码,已经找到高负载的问题,最终的解决方案 
有待进一步的测试。

问题描述:
1.ticker(mongserver的一个任务/协程)根据预设的规则判定一个链接需要关闭, 
于是调用 Rigsiter_disconnect函数关闭了与之关联的IOBuf和socket。
2.由于在关闭时,数据还没有上传完成,所以HTTP协程通过IOBuf_read_all会不断 
的调用IOBuf_read函数去读取数据,而 IOBuf_read判定IOBuf已经关闭,于是返 
回。而IOBuf_read_all只检测数据有没有接受完,如果没有,则继续调用 
IOBuf_read读取数据,从而形成事实上的无线循环。

解决方案:
     在IOBuf_read_all里面检测IOBuf是否关闭,打破无限循环。

疑问:打破无限循环之后,怎么处理的问题,是否需要向正常情形一样,把数据交 
给Bamboo处理。

初步想法:清空这些不完全的数据,然后交Bamboo处理。这样的好处有两点:1.不 
修改(扰乱)Monserver的处理流程。2.不隐藏数据 传送中断的信息。