首先庆祝一下QQ餐厅正式不删档公测,本以为终于可以不用那么晚发版本了,结果昨晚入口CGI出现问题,折腾到凌成4点多,杯具……

先截个餐厅的图给大家看一下:

canting

先来介绍下背景,公司是使用自己写的webserver,然后用fastcgi的方式运行CGI,结果前端返回502错误。和运维的同学确认后,了解到当CGI在执行完却没有返回给webserver任何数据,就会报502错误。
检查了一下代码,任何出错都会有错误返回。
于是strace了一下进程,发现在出现一次如下的错误之后,以后的请求就全部都会出错。

修改

其实这个CGI和平常的CGI没有什么区别,只是由于用到了模板类,所以使用cout来进行输出而不是printf,结果问题就出在了cout上。

与printf不同,cout在出错之后,会保存出错的状态,而由于fastcgi是一直在内存里的,所以在cout第一次出错之后,后面的就全部都会出错。
解决的方法是:
在每次开始cout数据之前,调用一下cout.clear()

之后,问题得到解决,在出现上图中的错误之后,以后的数据也一样可以正常输出。

但是这样毕竟不是办法,因为当访问量非常高的时候,用户遇到错误的概率也是非常高的。

以为是cout的数据不全,于是尝试在CGI输出的最后,我加了一行:cout<<flush;,结果发现出错的概率反而变高了许多,于是就去掉了。

目前猜测的问题还是底层库可能有头文件和.a不一致的问题,之前碰到一个应为这个问题写越界的,还有一个也是这个原因结果编译成可执行时,cout会core,看来底层库的统一也是件大事啊

参考文章:
endl cout 缓冲区执行时立即刷新

最近的一些技术整理(20120109)

前段时间一直没写博客,昨天更新了一篇,今天突然又来了兴致,那就再更新一篇吧(所以说啊,治疗拖延症最好的方法就是现在开始做) 这篇还是一些技术的整理,...

阅读全文

C++模板的几个应用

C++的模板其实是个挺纠结的东西,用的不好的话,编译的一堆错误够你调到崩溃,但要是用的好呢,又确实非常方便,我们来看看 一.获取数组长度 比如 ...

阅读全文

又见C++诡异问题

用C++越久,越是觉得C++太多陷阱,真是防不胜防。 我们看这样一段代码: C++ #include <stdio.h> using namespace std; ...

阅读全文

13则回应给“QQ餐厅公测,入口CGI的一个bug定位”

  1. 雨碎江南说道:

    呃…CGI,古董了.

    [回复]

    Dante 回复:

    呵呵,其实C写的CGI虽然开发效率不及php和python,但是在访问量大的情况下CGI的效率会高非常多,为了减少服务器的成本,不得不用呀

    [回复]

    雨碎江南 回复:

    也是..

    [回复]

    MadPer 回复:

    其实,我一直想知道,perl和python的效率哪个高?

    [回复]

    Heiher 回复:

    赞同,内存和CPU使用都比较低,就是开发效率不怎么样。

    [回复]

  2. TaoGOGO说道:

    羡慕下,c写的难以控制~~php速度没有cgi快啊

    [回复]

    Dante 回复:

    呵呵,其实写CGI的确很痛苦,尤其每次等编译……

    [回复]

  3. hcconquer说道:

    呵呵,没想到居然看到同事的博客
    不过你这个涉嫌泄漏公司机密,触犯高压线啊~~

    [回复]

    Dante 回复:

    ……,这算什么高压线呀。。又不是只有腾讯自己在用cout。。。

    [回复]

  4. 奔跑的蜗牛说道:

    我也天天写CGI,互娱的。

    [回复]

    奔跑的蜗牛 回复:

    不过在考虑转php了。cgi太痛苦了。同感啊。

    [回复]

    Dante 回复:

    是啊。。cgi的确写起来太痛苦了。。老古董了。。

    [回复]

发表评论