问题标签 [contention]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 如何避免 string.intern() 争用并保持低内存占用?
我正在解析一个相当大 (200 MB) 的 XML 文件,该文件会生成一个对象树,每个对象都定义了一堆参数 (key=value)。此数据结构在 Tomcat webapp 中运行并用于查找这些参数。
几个月前,我们在这台服务器上发现了一个堆内存问题。我们可以通过实习参数键和值(其中大多数是非常冗余的)来解决它,这将内存占用从超过 150 MB 减少到低至 20 MB。
今天我正在重新访问服务器,因为人们抱怨启动时间。我正在分析服务器并看到使用 XPP3 解析 XML 需要 40 秒,其中 String.intern() 需要 30 多秒。
我知道这是一个权衡。我知道我可以自己做实习。由于解析 XML 是单线程的,因此简单的 HashMap 也可以完成这项工作。但你知道,这感觉有点奇怪。
是否有人计算过这些数字,看看是否值得放弃 String.intern 以支持不同的解决方案?
那么问题来了?我怎样才能使此类问题的争用尽可能低?
谢谢,斯特凡
.net - 多线程资源争用
我正在分析一个使用不同数量的允许线程运行的多线程程序。这是相同输入工作的三次运行的性能结果。
因为做同样的工作需要更多的线程时间,我觉得线程一定是在争夺资源。
我已经检查了应用程序机器和数据库服务器上的四个支柱(cpu、内存、diskIO、网络)。内存是最初的竞争资源,但现在已经修复(始终超过 1G 可用)。在 20 线程测试中,CPU 徘徊在 30% 到 70% 之间,所以很多。diskIO 在应用程序机器上几乎没有,在数据库服务器上几乎没有。网络真的很棒。
我还使用 redgate 进行了代码分析,并没有看到等待锁的方法。它有助于线程不共享实例。现在我正在检查更细微的项目,例如数据库连接建立/池(如果 20 个线程尝试连接到同一个数据库,它们是否必须相互等待?)。
我正在尝试识别和解决资源争用问题,以便 20 线程运行如下所示:
我应该寻找哪些最有可能的来源(除了四大)来找到这种争用?
每个线程执行的代码大约是:
WCF 服务在同一台机器上运行,并且是无状态的并且能够同时处理多个请求。
机器有8个cpu。
java - Java-Struts Web 应用程序中重构的方法会导致争用吗?
我正在与一家使用带有 Java 的 struts 生成 Web 应用程序的公司合作。我最近一直在重构很多代码来整理系统。我一直在使用的一种技术是将方法的流的关闭语句(在finally块中)移动到实用程序类。实用程序类是静态的,并且具有各种类型的流的关闭方法。通过进行这种重构,我每次需要关闭流时节省了 5 行代码,这将某些类中的代码减少了 600 行,使其非常有利。但是我担心这样做如果投入生产可能会引起对这些方法的争用。
我之前只在多线程编程中遇到过争用的概念,这就是为什么我不确定这是否会在这些实例中引起问题。
这可能吗?或者只是我对争用、静态方法、Web 应用程序等的误解?
在此先感谢,阿列克谢蓝。
c++ - Splitting up a program into 4 threads is slower than a single thread
I've been writing a raytracer the past week, and have come to a point where it's doing enough that multi-threading would make sense. I have tried using OpenMP to parallelize it, but running it with more threads is actually slower than running it with one.
Reading over other similar questions, especially about OpenMP, one suggestion was that gcc optimizes serial code better. However running the compiled code below with export OMP_NUM_THREADS=1
is twice as fast as with export OMP_NUM_THREADS=4
. I.e. It's the same compiled code on both runs.
Running the program with time
:
User time is a lot smaller than real, which is unusual when using multiple cores- user should be larger than real as several cores are running at the same time.
Code that I have parallelized using OpenMP
When reading this question I thought I had found my answer. It talks about the implementation of gclib rand() synchronizing calls to itself to preserve state for random number generation between threads. I am using rand() quite a lot for monte carlo sampling, so i thought that was the problem. I got rid of calls to rand, replacing them with a single value, but using multiple threads is still slower. EDIT: oops turns out I didn't test this correctly, it was the random values!
Now that those are out of the way, I will discuss an overview of what's being done on each call to computePixel
, so hopefully a solution can be found.
In my raytracer I essentially have a scene tree, with all objects in it. This tree is traversed a lot during computePixel
when objects are tested for intersection, however, no writes are done to this tree or any objects. computePixel
essentially reads the scene a bunch of times, calling methods on the objects (all of which are const methods), and at the very end writes a single value to its own pixel array. This is the only part that I am aware of where more than one thread will try to write to to the same member variable. There is no synchronization anywhere since no two threads can write to the same cell in the pixel array.
Can anyone suggest places where there could be some kind of contention? Things to try?
Thank you in advance.
EDIT: Sorry, was stupid not to provide more info on my system.
- Compiler gcc 4.6 (with -O2 optimization)
- Ubuntu Linux 11.10
- OpenMP 3
- Intel i3-2310M Quad core 2.1Ghz (on my laptop at the moment)
Code for compute pixel:
From the suggestions, it might be the tree traversal that causes the slow-down. Some other aspects: there is quite a lot of recursion involved once the sampling function is called (recursive bouncing of rays)- could this cause these problems?
c++ - 最小化锁争用 c++ std::map
我有一个std::map<int, Object*> ObjectMap
. 现在我需要更新地图,更新可以通过多个线程进行。因此,我们锁定地图以进行更新。但是每次更新都会导致冗长的计算,从而导致锁争用。
让我们考虑以下场景。
每个客户也会更新,涉及一些计算。现在这是一个微不足道的观察者模式。但是,大量的观察者和每个观察者的巨大计算是这种设计的杀手锏。锁定争用在我的代码中上升。我认为这是一个实际问题,但人们使用更聪明的方法,我正在寻找那些更聪明的方法。我希望这次我有点清楚
谢谢希夫
c# - 如何测量一把锁的争用率
我目前正在维护的部分应用程序(.net 4.0,c#)的争用率存在问题。如果无法获得一个部分锁,我想做的是编写一个 PerfCounter。现在我只有.net 提供的整体计数器,但我想为某些选定的锁提供一个 PerfCounter。
Profiler 等对我来说不是一个选项,因为这是一个我无法触及的高性能生产环境,我可以记录 perfcounters。
google-app-engine - 避免 AppEngine 中的争用
我试图围绕争用以及它如何应用于应用程序引擎堆栈。
我有一个像这样构建的模型
该模型包含多个事件,每个事件都有一个所有者和一个有效负载,事件的所有者将向他的事件写入有效负载,而许多其他事件将从该事件中读取,这是一种转录堆栈。
我的问题是关于争用,我会受此影响吗?如果是,我该如何重组以防止它发生。
谢谢你。
c++ - 如何跨进程协调端口使用?
我需要在一台机器上让多个进程相互协调,以便每个进程选择不同的端口来创建套接字以与不同的机器通信。每个进程必须从一系列可用端口中选择一个端口号,以便在任何时间点只有一个进程使用给定的端口号。
是否有现有的机制来进行这种协调,还是我需要建立自己的机制?
目前,我正在使用磁盘上的文件来注册端口号和使用该端口的 PID。如果找到一个不再运行 PID 的条目,则删除该条目,因为假定进程已非正常退出,因此需要获取该条目。
但是,我似乎有某种竞争条件,因为在极少数情况下,我最终有两个进程使用相同的端口,而第二个进程看不到显示保留端口的文件内容并最终再次使用它。
与其解决这个问题,我宁愿采用现有的机制来避免端口冲突,所以我想问这样的实用程序是否已经存在。
c++ - 测量互斥量争用/解释 mutrace 输出
我正在尝试使用 mutrace 在我的程序中测量互斥量争用,但对于如何使用它输出的报告感到困惑。
看来我肯定有互斥争用问题,但我不知道如何将其与我的源代码相关联。我希望有更好的回溯然后这个。
根据 mutrace 的网站(和 -g -gdb 也是),该可执行文件已使用 -rdynamic 编译。
我在stackoverflow上发现了mutrace,所以希望有一些有经验的人!
谢谢。
simulation - Verilog 与下一个信号的争用
我正在尝试实现以下代码:
这在模拟中工作得很好,但在综合中似乎对 next_busy 信号存在某种争用。也就是说,如果busy 不是1(比如前一个周期有一个复位),那么它输出一个x(如果满足输入条件)。但是,如果busy 已经为1(并且满足输入条件),则next_busy 被正确分配为1。所以我只是想知道是否有一种正确的方法来做我想做的事情,这样它也可以在综合中起作用?