java.util.Random的实例是线程安全的.但是,跨线程并发使用相同的java.util.Random实例可能会遇到争用并因此导致性能不佳.请考虑在多线程设计中使用ThreadLocalRandom.
表现不佳背后的原因可能是什么?
我在Ubuntu 14上运行PhantomJS的多个实例时遇到问题.几分钟后,进程无响应.
简要背景:使用PhantomJS 2.0渲染最终使用Wkhtmtopdf保存为PDF的网页.PhantomJS仅负责加载页面,发出ajax请求,并在将PDF保存在服务器上之后等待响应.它不会生成PDF本身.需要将数百个网页生成为PDF,因此我希望在系统允许的情况下并行运行尽可能多的PhantomJS实例.
每个PhantomJS进程都由shell脚本启动,如下所示:
{path to phantomjs} {path to js file} --data {some argument} >> {path to log file} 2>&1 &
问题发生在几分钟之后,我停止从PhantomJS进程获得任何输出,并且看着top我可以看到他们只是躺在那里没有做任何事情.JS脚本具有在超过一分钟时重试加载页面的计时器,并且phantom.exit()如果页面无法加载/ PDF生成失败,则最终调用.因此,即使出现问题,该过程仍应退出 - 但事实并非如此.
我尝试更改并行运行的PhantomJS实例的数量.试过20 - > 10 - > 5 - > 3,但似乎并不重要.实际上,当一次维护20个实例时,我可以成功执行更多作业.
在运行时,--debug=true我可以看到它在某些时候被卡住了.
[DEBUG] WebPage - updateLoadingProgress:
同时通过输出我看到了几个警告:
[WARNING] QIODevice::write: device not open
这让我相信这是问题的根源.
我以为可能会有一些争用文件资源,所以我试过没有将输出重定向到日志文件,而不是使用--local-storage-path,但这没有帮助.
作为旁注,我几年来一直在使用PhantomJS执行相同的过程,只是顺序执行(一次运行一个PhantomJS进程).虽然有一些障碍需要克服,但效果很好.
知道是什么导致了这个吗?有人遇到过类似的问题吗?有关并行运行多个PhantomJS实例的建议吗?
谢谢!
过去一周我一直在写一个光线跟踪器,并且已经达到了足够多线程有意义的程度.我已经尝试使用OpenMP来并行化它,但是用更多线程运行它实际上比用一个线程运行它要慢.
阅读其他类似问题,特别是有关OpenMP的问题,一个建议是gcc更好地优化串行代码.但是,运行下面的编译代码的export OMP_NUM_THREADS=1速度是以下的两倍export OMP_NUM_THREADS=4.即两次运行的编译代码相同.
运行程序time:
> export OMP_NUM_THREADS=1; time ./raytracer
real 0m34.344s
user 0m34.310s
sys 0m0.008s
> export OMP_NUM_THREADS=4; time ./raytracer
real 0m53.189s
user 0m20.677s
sys 0m0.096s
Run Code Online (Sandbox Code Playgroud)
用户时间比实际小很多,这在使用多个核心时很不寻常 - 用户应该比实际大,因为多个核心同时运行.
我使用OpenMP并行化的代码
void Raytracer::render( Camera& cam ) {
// let the camera know to use this raytracer for probing the scene
cam.setSamplingFunc(getSamplingFunction());
int i, j;
#pragma omp parallel private(i, j)
{
// Construct a ray for each pixel.
#pragma omp for …Run Code Online (Sandbox Code Playgroud) 在调试我们的系统问题时,我发现线程争用导致了瓶颈。我需要向参与处理此问题的其他人解释这一现象。其中一些不是来自开发团队(但是,他们具有相当的技术性)。那么什么类型的图表可以用来描述线程问题,例如争用、死锁等?一些例子会非常有用。
我目前在使用某个应用程序(.net 4.0,c#)的争用率时遇到问题.我正在维护.我想做的是写一个PerfCounter,如果一个部分锁无法被获取.现在我只有.net提供的整体计数器,但我想为一些选定的锁具有PerfCounter.
Profiler等对我来说不是一个选择,因为这是一个我无法触及的高性能生产环境,我可以记录perfcounters.
在Oracle 11gR2上,我最近遇到了一个非常有趣的情况,涉及阻塞(但是空闲!)MERGE语句,该语句挂起"来自客户端的SQL*Net消息"事件,导致后续的,并发执行的MERGE语句在第一个语句上阻塞" cursor:pin S等待X"事件.在Oracle Enterprise Manager中,可以观察到以下内容:
这种情况变得更加严重,因为上述Session-ID 1204无法被杀死:
alter system kill session 'sid,serial#';
alter system kill session 'sid,serial#' immediate;
Run Code Online (Sandbox Code Playgroud)
我们的DBA有时会破坏操作系统进程,但通常需要重新启动整个数据库.幸运的是,到目前为止,仅在测试系统上,从未投入生产.
我知道这可能是一个类似于这个相当含糊的问题中报告的类似问题:Oracle更新/插入卡住,DB CPU为100%,并发性高,来自客户端的SQL*Net等待消息.我还会再次报告,因为我有一个清晰的再现路径,我将作为答案报告.
我正在调试一些对目录路径执行一些存在检查的遗留代码。首先,DirectoryPathA如果存在则检查并返回。这应该是通常的情况。如果失败,DirectoryPathB则检查并返回。(如果这也失败了,其他事情就会发生,而不是这个问题的一部分)。代码如下所示:
if (!string.IsNullOrEmpty(DirectoryPathA))
{
driveInfo = new DriveInfo(DirectoryPathA);
if (driveInfo.IsReady)
{
dInf = new DirectoryInfo(DirectoryPathA);
if (dInf.Exists)
{
return DirectoryPathA;
}
}
}
if (!string.IsNullOrEmpty(DirectoryPathB))
{
dInf = new DirectoryInfo(DirectoryPathB);
if (dInf.Exists)
{
return DirectoryPathB;
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,第一个检查有一个基于 的额外保护DriveInfo.IsReady。之前网络上的文件访问存在问题,所以我的假设是(同样,这是遗留代码)DirectoryPathB如果DirectoryPathA不可用,则引入它作为替代方案。我不知道为什么没有DriveInfo.IsReady对DirectoryPathB.
即使DirectoryPathA是本地目录(因此不会出现网络中断),上面的代码也会偶尔返回DirectoryPathB. 代码被执行多次并被假定为幂等的,但事实并非如此,这会破坏事情。这只是在几个小时内在某些机器上偶尔发生。我无法重现该问题。
驱动器状态在整个程序执行过程中永远不会改变的假设存在一个基本问题。我明白那个。但是,这段代码在大多数情况下似乎都很好,而且过去一直如此。
什么原因DriveInfo.IsReady是false?
该文件指出
true如果驱动器已准备好;false如果驱动器未准备好。
谢天谢地。备注部分添加
IsReady 指示驱动器是否准备就绪。例如,它指示 CD 是否在 …
继续从了解VS2010 C#并行性能分析结果的讨论,但更重要的是:
我有许多并行工作的线程(使用Parallel.For/Each),它们为小类使用许多内存分配.
这会在全局内存分配器线程上产生争用.
有没有办法指示.NET为每个线程预分配内存池并从该池中进行所有分配?
目前我的解决方案是我自己的内存池实现(全局分配的类型为T的对象数组,它们在线程中循环使用)这有很大帮助,但效率不高,因为:
谢谢,
哈该
我在Google App Engine中遇到了争用问题,并尝试了解正在发生的事情.
我有一个请求处理程序注释:
@ndb.transactional(xg=True, retries=5)
Run Code Online (Sandbox Code Playgroud)
..在那段代码中,我获取了一些东西,更新了其他一些东西等等.但是有时在请求期间会出现像这样的错误:
16:06:20.930 suspended generator _get_tasklet(context.py:329) raised TransactionFailedError(too much contention on these datastore entities. please try again. entity group key: app: "s~my-appname"
path <
Element {
type: "PlayerGameStates"
name: "hannes2"
}
>
)
16:06:20.930 suspended generator get(context.py:744) raised TransactionFailedError(too much contention on these datastore entities. please try again. entity group key: app: "s~my-appname"
path <
Element {
type: "PlayerGameStates"
name: "hannes2"
}
>
)
16:06:20.930 suspended generator get(context.py:744) raised TransactionFailedError(too much contention on these datastore …Run Code Online (Sandbox Code Playgroud) python google-app-engine contention app-engine-ndb google-cloud-datastore
我们的Tomcat Web应用程序在被几百个用户使用时感觉很慢.服务器在托管公司,他们的报告没有显示带宽或CPU工作负载的任何问题,所以我怀疑减速的原因可能是因为我们封装在同步调用下的一些遗留代码的争用,因为它是更容易的路径
我在开发环境中做了一些人工测试,用ThreadLocal解决方案改变了同步调用,它变得更快,但我知道我的老板会要求我一些证据表明它的生产速度也会更快.
我怎么能确定我的应用程序中的线程争用是否存在问题?
contention ×10
c# ×3
performance ×3
concurrency ×2
java ×2
.net ×1
c++ ×1
deadlock ×1
diagram ×1
directory ×1
drive ×1
hang ×1
javascript ×1
openmp ×1
oracle ×1
phantomjs ×1
python ×1
scalability ×1
sql ×1
sql-merge ×1