- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用 pthreads 在 C++ 中的 Linux 上制作 Web 服务器。我用 valgrind 测试了它是否存在泄漏和内存问题 - 都已修复。我用 helgrind 测试了它的线程问题 - 都已修复。我正在尝试 stress test .当程序与 helgrind 一起运行时我遇到了问题
valgrind --tool=helgrind ./chats
它只是死在随机的地方,并带有文本“Killed”,就像我用 kill -9
杀死它时一样。我有时从 helgrind 得到的唯一报告是该程序存在但仍持有一些锁,这在被杀死时是正常的。
检查泄漏时:
valgrind --leak-check=full ./chats
它更稳定,但我设法让它在几百个并发连接时死掉一次。
我试过单独运行程序,根本无法让它崩溃。我尝试了多达 250 个并发连接。每个线程延迟 100 毫秒,以便更容易同时拥有多个连接。没有崩溃。
在所有情况下,线程和连接数都不会超过 10,我看到它即使有 2 个连接也会崩溃,但绝不会同时只有一个连接(包括主线程和一个辅助线程总共 3 个) .
我测试了一点,发现它只会在客户端超时并关闭连接时死掉。所以这里是检测客户端关闭套接字的代码:
void *TcpClient::run(){
int ret;
struct timeval tv;
char * buff = (char *)malloc(10001);
int br;
colorPrintf(TC_GREEN, "new client starting: %d\n", sockFd);
while(isRunning()){
tv.tv_sec = 0;
tv.tv_usec = 500*1000;
FD_SET(sockFd, &readFds);
ret = select(sockFd+1, &readFds, NULL, NULL, &tv);
if(ret < 0){
//select error
continue;
}else if(ret == 0){
// no data to read
continue;
}
br = read(sockFd, buff, 10000);
buff[br] = 0;
if (br == 0){
// client disconnected;
setRunning(false);
break;
}
if (reader != NULL){
reader->tcpRead(this, std::string(buff, br));
}else{
readBuffer.append(buff, br);
}
//printf("received: %s\n", buff);
}
free(buff);
sendFeedback((void *)1);
colorPrintf(TC_RED, "closing client socket: %d\n", sockFd);
::close(sockFd);
sockFd = -1;
return NULL;
}
// this method writes to socket
bool TcpClient::write(std::string data){
int bw;
int dataLen = data.length();
bw = ::write(sockFd, data.data(), dataLen);
if (bw != dataLen){
return false; // I don't close the socket in this case, maybe I should
}
return true;
}
附言线程是:
完整的代码非常大,但如果有人感兴趣,我可以发布 block 。
更新:
我设法通过一个连接触发了问题。这一切都发生在客户端线程中。这就是我所做的:
我是这样写的
bw = ::write(sockFd, data.data(), dataLen);
// bw is = dataLen = 108 when writing the headers
//then secondary write for HTML kills the program. there is a message before and after write()
bw = ::write(sockFd, data.data(), dataLen); // doesn't go past this point second time
更新 2:知道了 :)
gdb 说:
Program received signal SIGPIPE, Broken pipe.
[Switching to Thread 0x41401940 (LWP 10554)]
0x0000003ac2e0d89b in write () from /lib64/libpthread.so.0
问题1:我应该怎么做才能取消接收到这个信号。问题2:如何在写入时知道远程端断开连接。读取时选择返回有数据但数据读取为 0。写入如何?
最佳答案
好吧,我只需要处理 SIGPIPE 信号并写入返回的 -1 -> 我关闭套接字并优雅地退出线程。就像一个魅力。
我想最简单的方法是将 SIGPIPE 的信号处理程序设置为 SIG_IGN:
signal(SIGPIPE, SIG_IGN);
请注意,第一次写入是成功的,并没有终止程序。如果您有类似的问题,请检查您是写了一次还是多次。如果你不熟悉 gdb,这是如何做到的:
gdb ./your-program
> run
gdb 会告诉您有关信号和信号故障的所有信息。
关于c++ - valgrind/helgrind 在压力测试中被杀死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19770250/
已关闭。此问题旨在寻求有关书籍、工具、软件库等的建议。不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以
我在 tomcat 服务器上部署了一个 Web 应用程序。我通过 POST 方法上传文件,然后上传文件被转码为另一种类型(例如 3gp 到 flv)。我如何测试,有多少并发上传和转码我的 Web 应用
我想知道是否有任何方法可以获取单击时的压力级别(用户单击鼠标键/按钮时产生的压力)。有资源或链接吗? 抱歉我的英语不好,希望我的问题很清楚,希望不仅仅是乌托邦! 最佳答案 我意识到我正在用一些当时不相
我写信是为了问一个关于 WCF 性能的问题。 1。背景 我们有一个在 .NET 3.5 上运行的客户端-服务器系统。服务器是 C# 服务,客户端是 silverlight 应用。 我写了一个压力测
我想编写一份包含 NMS 排序的报告。我想在报告中包含代码,但不包含运行压力。 我试过 message=FALSE, warning=FALSE, results='hide' 但它仍然包含在报告中。
我今天第一次尝试使用 cassandra-stress 工具。尽管我能够运行该工具,但输出中会显示很多“无法通过 JMX 连接;未收集这些统计信息”消息 命令 cassandra-stress use
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我希望通过一遍又一遍地不断访问网址列表来模拟网络服务器上的重负载! 最初,我计划使用 wget/curl 编写一个简单的脚本,但由于该站点使用大量 ajax 请求来完成大部分繁重的工作,因此这不是一个
我最近创建了一个回合制游戏服务器,可以接受数以万计的同时客户端连接(长话短说 - Linux 上的 epoll)。通信基于简单、自定义、基于线路的协议(protocol)。该服务器允许客户端连接、寻找
Stress-ng:我们可以使用stress-ng测试RAM吗?用于在 MIPS 32 设备上测试 RAM 的命令是什么? 最佳答案 在stress-ng中有许多基于内存的压力源: stress-ng
我正在 iPhone 上测试我的简单 OpenGL ES 实现(2D 游戏),并且在使用分析器时我注意到渲染利用率很高。这些是事实: 我以 60 fps 的速度仅显示一个预加载的大型纹理(512x51
我正在 canvas 上编写应该支持平板电脑和触摸压力的网络应用程序。不过,如果我没记错的话,我相信只有IE10支持这些指针事件。我想知道 chrome 和 firefox 是否会很快支持它? 最佳答
Stress-ng:如何使用 execv 在 C 或 Cpp 中编写应用程序来调用 stress-ng 命令以在 MIPS 中进行 CPU 和内存测试,并在成功或失败时返回其状态?给定一个可执行的 s
我是一名优秀的程序员,十分优秀!