问题现象
程序接收数据,对数据进行简单地处理,处理完之后发送到其他平台。程序在接收到数据到在其他平台上面显示时间差了将近一个小时。存放要发送到其他平台的数据的容器积压了大概一百五十多万条的数据。
问题排查过程
1、接收数据与发送数据到其他平台显示之间出现较大的时间间隔就是由于数据积压导致的。出现数据积压的原因有两种,一种是数据输入量太大,一种是数据输出太慢。数据输入量是固定的,而且输入量不算大,所以首先通过加大输出数据的线程排查。可是问题并没有解决。
2、因为数据输出前需要对数据进行处理,判断是否是处理的过程有问题,通过计算单条数据处理输出的时间。
Linux下计算程序运行的时间:
/* 一个简单计算程序运行时间的代码,时间单位是ms */
int DealData(string data)
{
struct timeval start, end;
double timeuse = 0;
gettimeofday(&start, NULL);
/*
数据实际处理过程
*/
gettimeofday(&end, NULL);
//获取上面这段代码运行所用时间,单位:ms
timeuse = (end.tv_sec - start.tv_sec)*1000 + (double)(end.tv_usec - start.tv_usec)/1000.0;
return 0;
}
程序处理的数据种类很多,通过计算每种数据处理并发送到平台的时间,排查出是在处理图片数据时间花费的时间较长,一张图片处理及发送到平台花费时间大概为10多秒,发送数据的方式为http。而数据处理只是将具体的图片加密,处理的时间很短,属于正常范围内,说明问题出在发送http数据上面。
2、发送http数据时间较长,首先排查是否是发送的数据量太大导致。通过查看发送的实际图片,了解到图片在发送前已经处理过了,实际发送的大小一般只有500kb左右,由此判断不是发送的数据量太大导致,进一步判断是由于传输过程除了问题导致的。
3、http传输的过程可以简单分为两步:(1)发送数据到平台;(2)平台接收到数据并给出响应,发送方收到响应,传输过程结束。首先测试发送数据的时间,可以直接在服务器上测试,不通过程序。
Linux下测试http发送数据的时间,命令如下:
# URL是要发送的http地址,POST 指明发送的是post指令,data.json是要发送的数据文件
Time curl URL -X POST -H "Content-Type:application/json;charset=UTF-8" -d @data.json
通过以上命令测试,发现发送相同的数据,发送的时间也是10多秒,说明不是由于程序导致的发送http时间较长,而当前网络也没有问题,由此判断由于接收方平台出现了问题,收到数据后给出响应时间太长导致整个http时间变得很长。
4、联系接收方解决,最终问题解决。用上面的命令再次测试,发送数据时间为300毫秒左右,程序处理速度变快,积压的数据一下就跑完了,问题解决.
总结
遇到发送http数据积压问题:
1、首先看发送时间的是否太长;
2、发送时间太长,首先判断是否是传输的数据包太大导致;
3、再判断是由于发送时间太长,还是响应时间太长导致的,这一步也可以通过抓包判断。