【wait event】--CPU Time

本次10gRAC培训为期四天,解决了许多关于RAC系统诊断和调优的问题,包括AWR报告解读、CacheFusion机制、CRS相关日志分析等。文章还讨论了CPUTime在性能报告中的意义及其与系统负载的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

10gRAC培训 - 2 and last:

 

为期4天的10g RAC培训结束了,必须承认这4天的收获非常大,解答了很多我以前一直迷惑的地方,并且获得了大量诊断和调优RAC系统的经验。Su和Roy的技术实在让人佩服。

对于AWR报告中RAC部分的表述,对于RAC每个重要等待事件的含义,对于Cache Fusion的每一步动作,对于CRS相关的log和trace,对于Load Balance的处理,对于Dynamic Resource Management的机制,这些都是我以前感到疑惑的地方,在这次培训中都得到了几乎完美的解答。

举一个简单的例子,如果有人问我,“RAC环境中如果一个实例在自己的Cache中找不到需求的block,那么它就会请求从另外一个实例中获得这个block,那么如果有更多的节点,这样的请求过程会很消耗资源吗?8个节点下的这种情况会比2个节点更消耗资源吗?”在这次培训之前,我无法回答,甚至我会说,恩,也许是的吧。但是,现在我可以很清楚地回答,NO!因为在一次gc block request中最多只会有3个block参与到其中,而不管环境中有多少个节点,这就是master block的作用,每次request的过程是requester -> master -> holder。

其实并不局限在RAC部分,纯RDBMS的知识也得到了完善,再举一个例子。对于性能报告中CPU Time这个等待事件我一直感到疑惑,这到底表示了什么?CPU Time位于Top 5 wait event中表示了什么?我还在网上跟Fenng聊过这个问题,也仍然抱有疑惑。然而,现在我知道,我们忽略Top 5中的CPU Time并不是因为它是Idle wait也不是因为我们要从其它的等待中判断CPU Time等待,我们忽略它是因为CPU Time就是说明系统在利用CPU干活,实际上这不是一个等待事件,CPU Time高表示系统在干活,而这是个好的现象,因为系统并没有把时间耗费在Wait上。Elapsed Time = CPU Time + Wait Time,所以甚至我们可以说CPU Time越高越好。

有太多的资料和学习笔记需要整理,今后应该会陆续把Topic写成文章的,不过不会很快,因为之后几天我得休息一下,然后把报销搞定,还有琢磨一下新入手的Nokia N95。

BTW: RAC Pack的宗旨是高举Oracle的三个代表 - CRS, ASM, RAC

 

from:http://www.dbform.com/html/2007/337.html

 

 

[转载]statspack中cpu time的学习:

 

kamus在他的blog10gRAC培训 - 2 and last。说到了这个cpu time,具体可以看正文以及下面我与他的留言,他的意思其实就是:

CPU Time相对于其它等待事件,应当先忽略CPU Time,处理其它等待事件。而且cpu time高一般代表是好事情,因为系统并没有把时间耗费在Wait上。Elapsed Time = CPU Time + Wait Time,所以甚至我们可以说CPU Time越高越好。

 

不是说他的不对,只是比较觉得这句话太容易误导别人,所以,给一些补充建议,我同意如果有很明显的其它事件,而cpu time不明显的时候,可以优先处理其它事件。但是,还有以下2个地方需要注意:

1、cpu time高一般代表系统的逻辑读大,或者是高计算型的东西,如case函数,decode函数,自定义的计算类型函数等等,把cpu给耗光了,但是这个时候可能根本没有其它等待事件。这样是否证明这个系统很好呢?很可能是,非常不好,因为他很有可能没有必要有这么多的逻辑多,或者是,没有必要有这么多的cpu密集型计算就可以完成的任务,现在消耗这么CPU Time就是不正常的,很容易导致系统负载异常。

2、至于wait time,比如OLTP环境上最典型的db file sequential read引起的等待,是因为发生了物理io而引起的,而很多时候,物理读是随逻辑读增加而增加的,而逻辑读可能会导致cpu time高,也就是说,cpu time与wait time一般是同时增加的。特别是比较高访问量,大数据量,大SGA的系统,逻辑读与物理读都比较高,除了cpu time与db file sequential read,可能不会有很明显的其它等待事件,而优化的结果可能是cpu time与wait time同时减少。

 

既然说到了db file sequential read,也解释一下这个事件,与cpu time一样,很多时候说明系统是比较正常的,一个优化非常良好的系统,很可能第一个等待事件就是它。因为没有一个系统,不会发生任何物理IO,既然有物理IO,当然db file sequential read就是最好的了,一般表示读数据正常。同样的理由,db file sequential read大了,也可能预兆系统有不该有的物理读发生了。

如一个看起来很正常的sql语句,单个语句效率看起来并不差,执行时间已经小于0.01秒。假定原来逻辑读每个语句平均是100个,物理读平均10个,执行次数每小时50万次,优化完成以后,逻辑读降低为平均50个,物理读平均5个,那么,每小时降低的逻辑读总量就是50*50w=2500w个,降低的物理读为5*50w=250w个。那么再假定每个cpu每秒处理100000个逻辑读就达到了极限,每个物理读需要等待8ms,那么,就可以减少约2500w/100000*3600=7%的CPU使用率(单CPU),可以减少250w*8ms=20000秒的总io wait time。

同理,如果能采用同样的方法,减少执行次数从每小时50w到每小时25w,则收到的效果是一样的。

 

评价这个cpu time与db file sequential read是否正常,需要很多调优的经验,不过,需要记住的是,任何情况下,不要绝对的说好还是不好。最好的方式就是从statspack或者是awr上看看,排在cpu time,或者是物理读top的语句,他们是否应当有这么大的消耗,他们是否应当执行这么多的次数。

 
作者: piner(转载请注明本文出处: Ixdba.com)

 

<think>好的,我现在需要处理用户关于在PowerShell中使用`Get-Content -Wait`添加超时的问题。首先,用户之前遇到了一个`ArgumentNullException`异常,现在又转向另一个问题,可能他们在处理文件监控时遇到了需要超时的情况。我需要先理解`Get-Content -Wait`的基本功能。 `Get-Content -Wait`用于持续监控文件的变化,并在内容更新时输出新内容。但默认情况下,这个命令会无限期运行,用户可能希望在一定时间后自动停止,避免脚本长时间挂起。这时候就需要添加超时机制。 接下来,我需要考虑如何在PowerShell中实现超时。常见的方法包括使用作业(Job)、定时器,或者循环加超时检查。用户可能对PowerShell的不同方法不太熟悉,所以需要给出几种不同的解决方案,并比较它们的优缺点。 首先,使用`Wait-Event`结合定时器事件。这种方法相对简洁,但需要了解事件处理机制。用户可能对事件注册和动作块不太熟悉,所以需要详细解释每一步的作用。 第二种方法是使用`Start-Job`和`Wait-Job`,设置超时参数。这种方法利用了作业管理,用户可能更熟悉作业的概念,但需要处理作业的结果和清理,这可能增加复杂度。 第三种方法是手动循环检查,结合`Start-Sleep`。这种方法直观,但需要处理循环和超时逻辑,可能代码量稍多,但适合对实时性要求不高的场景。 另外,用户可能还需要知道如何强制终止作业,防止超时后进程残留,所以需要提到`Stop-Job`和`Remove-Job`的重要性。 在解释过程中,需要确保代码示例正确,比如在事件处理中使用`Register-ObjectEvent`来监控文件,同时使用`Wait-Event`等待事件触发,并设置超时参数。同时,要指出不同方法的适用场景,比如实时性要求高的用事件,简单的用循环。 还需要注意错误处理,比如在超时后如何优雅地退出,以及如何处理可能出现的异常,比如文件不存在的情况。用户之前的错误涉及参数为空,可能在文件路径错误时再次出现类似问题,所以可以建议添加路径验证。 最后,总结各种方法的优缺点,帮助用户根据具体需求选择最合适的解决方案。确保回答结构清晰,步骤明确,代码示例正确,并符合用户的中文需求。</think>在 PowerShell 中使用 `Get-Content -Wait` 监控文件变化时,默认会无限期等待新内容。若需添加超时(Timeout)机制以限制等待时间,可通过以下方法实现: --- ### **方法 1:使用 `Wait-Event` + 定时器(推荐)** 结合事件监听和超时逻辑,精准控制等待时间。 ```powershell $filePath = "C:\logs\example.log" $timeoutSeconds = 30 # 设置超时时间(秒) # 创建文件系统监视器 $watcher = New-Object System.IO.FileSystemWatcher $watcher.Path = Split-Path $filePath -Parent $watcher.Filter = Split-Path $filePath -Leaf $watcher.NotifyFilter = [System.IO.NotifyFilters]::LastWrite # 注册文件写入事件 $eventJob = Register-ObjectEvent $watcher "Changed" -Action { $global:fileChanged = $true } try { $global:fileChanged = $false $timer = [System.Diagnostics.Stopwatch]::StartNew() while (-not $global:fileChanged -and $timer.Elapsed.TotalSeconds -lt $timeoutSeconds) { Start-Sleep -Milliseconds 100 # 减少CPU占用 } if ($global:fileChanged) { Get-Content $filePath -Wait | ForEach-Object { # 处理新内容 Write-Host "New content: $_" } } else { Write-Warning "超时:未检测到文件变化(${timeoutSeconds}秒)" } } finally { $watcher.Dispose() Unregister-Event -SourceIdentifier $eventJob.Name } ``` --- ### **方法 2:使用 `Start-Job` + 超时参数** 通过后台作业运行 `Get-Content -Wait`,并限制等待时间。 ```powershell $filePath = "C:\logs\example.log" $timeoutSeconds = 30 # 启动后台作业监控文件 $job = Start-Job -ScriptBlock { param($path) Get-Content $path -Wait } -ArgumentList $filePath # 等待作业完成或超时 $job | Wait-Job -Timeout $timeoutSeconds if ($job.State -eq "Running") { Write-Warning "超时:强制终止监控" $job | Stop-Job -PassThru | Remove-Job } else { # 获取作业输出的内容 $job | Receive-Job $job | Remove-Job } ``` --- ### **方法 3:手动循环检查(简化版)** 通过轮询文件修改时间,结合超时逻辑。 ```powershell $filePath = "C:\logs\example.log" $timeoutSeconds = 30 $startTime = Get-Date $lastContent = Get-Content $filePath -Tail 0 # 初始内容(空) while ((Get-Date) - $startTime -lt [TimeSpan]::FromSeconds($timeoutSeconds)) { $currentContent = Get-Content $filePath -Tail 0 -ErrorAction SilentlyContinue if ($currentContent -ne $lastContent) { Write-Host "检测到新内容:$currentContent" $lastContent = $currentContent } Start-Sleep -Seconds 1 # 检查间隔 } if ((Get-Date) - $startTime -ge [TimeSpan]::FromSeconds($timeoutSeconds)) { Write-Warning "超时:未检测到新内容" } ``` --- ### **方法对比** | 方法 | 优点 | 缺点 | 适用场景 | |---------------|-------------------------------|-------------------------------|------------------------| | `Wait-Event` | 实时响应,资源占用低 | 需要理解事件模型 | 高频率文件监控 | | `Start-Job` | 代码简洁,直接利用原生参数 | 需管理作业生命周期 | 简单超时需求 | | 手动循环检查 | 无需复杂事件机制,兼容性好 | 延迟较高,CPU占用略高 | 低频监控或简单脚本 | --- ### **关键点总结** 1. **超时原理**:通过计时器或 `Wait-Job -Timeout` 限制最长等待时间。 2. **资源释放**:超时后务必终止后台作业或事件监听,避免内存泄漏。 3. **实时性权衡**:轮询间隔(如 `Start-Sleep -Seconds 1`)影响响应速度和CPU占用。 根据实际需求选择最适合的方案!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值