我正在尝试通过UPnP将音乐流式传输到XBox的Android应用.流媒体大部分工作,但很快,在一两分钟后,流媒体停滞,特别是当网络上有其他活动时.当流式传输到其他非XBox设备时,这种情况从未发生过.我已经使用许多不同的UPnP服务器应用程序确认了这种行为.
在分析了大量的Wireshark痕迹之后,我找到了根本原因.似乎在TCP接收器窗口填充XBox之后,它只显式重新宣布窗口更新以响应包含1字节有效载荷数据的零窗口探测器.
虽然基于Windows的计算机发送包含1字节有效负载的Zero Window探测器,但基于Linux的计算机会发送包含0字节有效负载(纯ACK)的探测器.
在理想的网络条件下,这不是问题,因为一旦接收器在其窗口中释放足够的空间以避免愚蠢的窗口综合症,它将始终发送单个窗口更新ACK消息.但是,如果错过了单个Window Update数据包,它将永远不会再响应基于Linux的Android设备,因为这些设备上的TCP堆栈使用0字节有效负载的零窗口探测器(它们看起来像Keep Alive数据包到Wirehsark ).
XBox和WMP之间的TCP停顿如下所示:
4966 92.330358 10.0.2.214 10.0.2.133 TCP [TCP ZeroWindow] 27883 > 10243 [ACK] Seq=183 Ack=1723007 Win=0 Len=0
4971 92.648068 10.0.2.133 10.0.2.214 TCP [TCP ZeroWindowProbe] 10243 > 27883 [ACK] Seq=1723007 Ack=183 Win=64240 Len=1
4972 92.649009 10.0.2.214 10.0.2.133 TCP [TCP ZeroWindowProbeAck] [TCP ZeroWindow] 27883 > 10243 [ACK] Seq=183 Ack=1723007 Win=0 Len=0
4977 93.256579 10.0.2.133 10.0.2.214 TCP [TCP ZeroWindowProbe] 10243 > 27883 [ACK] Seq=1723007 Ack=183 Win=64240 Len=1
4978 93.263118 10.0.2.214 10.0.2.133 TCP [TCP ZeroWindowProbeAck] [TCP ZeroWindow] 27883 > 10243 …Run Code Online (Sandbox Code Playgroud) 我一直试图在 node.js 应用程序中追踪一个非常缓慢但持久的本机内存泄漏,但我已经用完了策略。
该进程似乎是一个级别堆,但随着时间的推移,node.js 进程的 RSS 缓慢增长。该进程是一个作业处理程序,它一遍又一遍地为不同的参数运行相同类型的作业。进程的 RSS 的增长与绘制作业运行的累积数量的线具有相同的形状,因此每个作业运行都会以某种方式泄漏一点内存。
由于堆或多或少是恒定的,标准堆检查工具似乎没有多大帮助。
以下是内存消耗情况的示例:

当前在节点 0.8.7 上运行。每个作业都会执行一些数据库读/写操作,与一个 redis 实例进行通信,并使用 mikael/request 执行一些 Web 请求。
我正在调查使用NSURLSessionUploadTasks来管理几个文件的后台上传.会话使用以下内容创建:
_urlsession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration backgroundSessionConfiguration:identifier] delegate:self delegateQueue:nil];
Run Code Online (Sandbox Code Playgroud)
这是在符合的类中创建的URLSessionDataTaskDelegate,并且具体定义:
– URLSession:dataTask:didReceiveResponse:completionHandler:
– URLSession:dataTask:didBecomeDownloadTask:
– URLSession:dataTask:didReceiveData:
Run Code Online (Sandbox Code Playgroud)
每次调用其中一个委托时,都会记录到控制台.
然后,使用以下代码创建上载任务:
NSString *urlString = [NSString stringWithFormat:@"%@%@?filename=%@", HOST, UPLOAD_PATH, filename];
NSMutableURLRequest *attachmentUploadRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]];
attachmentUploadRequest.HTTPMethod = @"POST";
[attachmentUploadRequest addValue:@"application/binary" forHTTPHeaderField:@"Content-Type"];
NSURLSessionTask* task = [_urlsession uploadTaskWithRequest:attachmentUploadRequest fromFile:filePath];
task.taskDescription = 'upload';
Run Code Online (Sandbox Code Playgroud)
但是,我得到的委托回调序列并不像预期的那样:
URLSession:didReceiveChallenge:completionHandler:]:196: Respond with <NSURLCredential: 0x1cf4fe00>:
URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:]:282: Task 'upload' sent 32768 bytes
URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:]:282: Task 'upload' sent 48150 bytes
URLSession:dataTask:didReceiveData:]:222: Task 'upload' got some data:
Run Code Online (Sandbox Code Playgroud)
值得注意的是,身体数据按预期发送,但随后立即切换到didReceiveData委托回调,didReceiveResponse事先没有回调.这对我来说是一个意想不到的行为:我希望收到有关响应的信息,以便我可以正确设置数据,或者更好的是,将任务转换为下载任务以将响应保存到文件中.
如果在默认URL会话中提交上载任务,则调用didReceiveResponse,我可以成功将任务转换为后台下载任务.
我在Apple的文档中找不到是否didReceiveResponse …
android ×1
delegates ×1
ios7 ×1
linux ×1
memory-leaks ×1
networking ×1
node.js ×1
nsurlsession ×1
tcp ×1
xbox ×1