On Thu, Sep 8, 2016 at 3:44 AM, Vitor Medina Cruz <vitormc...@gmail.com>
wrote:

> Hello,
>
> While profiling some I/O code that takes ~20 seconds to execute under my
> local image, the report says that about ~13 seconds is waste on
> OtherProcesses -> ProcessorScheduler class>>idleProcess. I could not
> understand what this idleProcess do by looking at the code. First I thought
> this could be time waiting the I/O operation to terminate, but that don't
> make much sense because I have the same code on a Digital Ocean Doplet and
> it takes ~6 seconds to execute.
>
> Can someone help me understand what does this time on idleProcess means?
>

The VM is not event-driven. Hence when all the processes are suspended or
terminated, the VM falls back to the idle process. The idle process waits
for 1ms, checks if any event has occurred and/or if a process can restart,
and if not waits for 1 more ms to check again. That's kind of dumb but it
works and we need both time and funds to make the VM event-driven (in the
latter case the VM restarts directly when an event happens, instead of
checking at the next ms).

Basically the idle process profiled time is the time where Pharo has
nothing to do because all processes are terminated or suspended. You can
say that it is the time spent in I/O operations + the time before Pharo
notices the I/O operation is terminated, which can be up to 1ms.


>
> The full report is:
>
>  - 18407 tallies, 18605 msec.
>
> **Tree**
> --------------------------------
> Process: (40s) Morphic UI Process: nil
> --------------------------------
> 25.1% {4663ms} UndefinedObject>>DoIt
>   25.1% {4663ms} TweetsServiceRestConsumer(TweetsService)>>hashesTop:
> usingLastTweetsUpTo:fromHandler:
>     25.0% {4656ms} TweetsServiceRestConsumer>>fetchLastTweetsUpTo:
> fromHandler:
>       14.3% {2653ms} OAuthProvider>>httpGet:
>         |14.3% {2653ms} ZnOAuth1Service>>httpGet:using:
>         |  14.3% {2653ms} ZnOAuth1Service>>executeRequest:token:
>         |    14.3% {2653ms} ZnOAuth1Service>>executeRequest:token:
> followRedirects:
>         |      14.2% {2646ms} ZnClient>>execute
>         |        14.2% {2646ms} ZnClient>>withProgressDo:
>         |          14.2% {2646ms} ZnSignalProgress class(DynamicVariable
> class)>>value:during:
>         |            14.2% {2646ms} ZnSignalProgress(
> DynamicVariable)>>value:during:
>         |              14.2% {2646ms} BlockClosure>>ensure:
>         |                14.2% {2646ms} ZnSignalProgress(
> DynamicVariable)>>value:during:
>         |                  14.2% {2646ms} ZnClient>>withProgressDo:
>         |                    14.2% {2646ms} ZnClient>>execute
>         |                      14.2% {2646ms} ZnClient>>executeWithTimeout
>         |                        14.2% {2646ms} ZnClient>>withTimeoutDo:
>         |                          14.2% {2646ms} ZnConnectionTimeout
> class(DynamicVariable class)>>value:during:
>         |                            14.2% {2646ms} ZnConnectionTimeout(
> DynamicVariable)>>value:during:
>         |                              14.2% {2646ms} BlockClosure>>ensure:
>         |                                14.2% {2646ms}
> ZnConnectionTimeout(DynamicVariable)>>value:during:
>         |                                  14.2% {2646ms}
> ZnClient>>withTimeoutDo:
>         |                                    14.2% {2646ms}
> ZnClient>>executeWithTimeout
>         |                                      14.2% {2646ms}
> BlockClosure>>on:do:
>         |                                        14.2% {2646ms}
> ZnClient>>executeWithTimeout
>         |                                          14.2% {2646ms}
> ZnClient>>executeWithRetriesRemaining:
>         |                                            14.2% {2644ms}
> BlockClosure>>on:do:
>         |                                              14.2% {2644ms}
> ZnClient>>executeWithRetriesRemaining:
>         |                                                14.2% {2644ms}
> ZnClient>>executeWithRedirectsRemaining:
>         |                                                  14.2% {2641ms}
> ZnClient>>getConnectionAndExecute
>         |                                                    13.8%
> {2569ms} BlockClosure>>ensure:
>         |                                                      13.8%
> {2569ms} ZnClient>>getConnectionAndExecute
>         |                                                        13.8%
> {2569ms} ZnClient>>executeRequestResponse
>         |                                                          13.8%
> {2569ms} ZnClient>>readResponse
>         |                                                            13.8%
> {2569ms} ZnResponse class(ZnMessage class)>>readFrom:
>         |
>  13.8% {2569ms} ZnResponse(ZnMessage)>>readFrom:
>         |
>  13.8% {2559ms} ZnResponse>>readEntityFrom:
>         |
>  13.8% {2559ms} ZnResponse(ZnMessage)>>readEntityFrom:
>         |
>    13.8% {2559ms} ZnEntityReader>>readEntity
>         |
>      13.8% {2559ms} ZnEntityReader>>readEntityFromStream
>         |
>        13.7% {2555ms} ZnEntityReader>>readFrom:usingType:andLength:
>         |
>          13.7% {2555ms} ZnEntity class>>readFrom:usingType:andLength:
>         |
>            13.7% {2555ms} ZnStringEntity>>readFrom:
>         |
>              13.7% {2550ms} BlockClosure>>on:do:
>         |
>                13.7% {2550ms} ZnStringEntity>>readFrom:
>         |
>                  13.7% {2550ms} ZnUTF8Encoder>>readInto:
> startingAt:count:fromStream:
>         |
>                    13.7% {2550ms} ZnUTF8Encoder>>
> optimizedReadInto:startingAt:count:fromStream:
>         |
>                      13.7% {2550ms} ZnLimitedReadStream>>readInto:
> startingAt:count:
>         |
>                        13.7% {2547ms} ZdcSecureSocketStream(
> ZdcOptimizedSocketStream)>>readInto:startingAt:count:
>         |
>                          13.7% {2547ms} ZdcSecureSocketStream(
> ZdcSimpleSocketStream)>>fillReadBuffer
>         |
>                            9.0% {1669ms} ZdcSecureSocketStream(
> ZdcSimpleSocketStream)>>fillReadBuffer
>         |
>                              |5.8% {1076ms} ZdcSecureSocketStream(
> ZdcSimpleSocketStream)>>fillReadBuffer
>         |
>                              |  |3.6% {671ms} ZdcSecureSocketStream(
> ZdcSimpleSocketStream)>>fillReadBuffer
>         |
>                              |  |  |1.8% {337ms} ZdcSecureSocketStream(
> ZdcSimpleSocketStream)>>fillReadBuffer
>         |
>                              |  |  |  |1.2% {225ms} BlockClosure>>on:do:
>         |
>                              |  |  |  |  1.2% {225ms} ZdcSecureSocketStream(
> ZdcSimpleSocketStream)>>fillReadBuffer
>         |
>                              |  |  |  |    1.2% {225ms}
> ZdcSecureSocketStream(ZdcAbstractSocketStream)>>socketWaitForData
>         |
>                              |  |  |  |      1.2% {225ms}
> Socket>>waitForDataFor:
>         |
>                              |  |  |  |        1.2% {225ms}
> Socket>>waitForDataFor:ifClosed:ifTimedOut:
>         |
>                              |  |  |  |          1.2% {225ms}
> Semaphore>>waitTimeoutMSecs:
>         |
>                              |  |  |  |            1.2% {225ms}
> DelayWaitTimeout>>wait
>         |
>                              |  |  |  |              1.2% {225ms}
> BlockClosure>>ensure:
>         |
>                              |  |  |  |                1.2% {225ms}
> DelayWaitTimeout>>wait
>         |
>                              |  |  |  |                  1.1% {196ms}
> DelayWaitTimeout(Delay)>>unschedule
>         |
>                              |  |  |  |                    1.1% {196ms}
> DelayExperimentalSpinScheduler>>unschedule:
>         |
>                              |  |  |1.8% {335ms} BlockClosure>>on:do:
>         |
>                              |  |  |  1.8% {335ms} ZdcSecureSocketStream(
> ZdcSimpleSocketStream)>>fillReadBuffer
>         |
>                              |  |  |    1.8% {335ms} ZdcSecureSocketStream(
> ZdcAbstractSocketStream)>>socketWaitForData
>         |
>                              |  |  |      1.8% {335ms}
> Socket>>waitForDataFor:
>         |
>                              |  |  |        1.8% {335ms}
> Socket>>waitForDataFor:ifClosed:ifTimedOut:
>         |
>                              |  |  |          1.8% {335ms}
> Semaphore>>waitTimeoutMSecs:
>         |
>                              |  |  |            1.8% {335ms}
> DelayWaitTimeout>>wait
>         |
>                              |  |  |              1.8% {335ms}
> BlockClosure>>ensure:
>         |
>                              |  |  |                1.8% {335ms}
> DelayWaitTimeout>>wait
>         |
>                              |  |  |                  1.5% {273ms}
> DelayWaitTimeout(Delay)>>unschedule
>         |
>                              |  |  |                    1.5% {273ms}
> DelayExperimentalSpinScheduler>>unschedule:
>         |
>                              |  |2.2% {405ms} BlockClosure>>on:do:
>         |
>                              |  |  2.2% {405ms} ZdcSecureSocketStream(
> ZdcSimpleSocketStream)>>fillReadBuffer
>         |
>                              |  |    2.2% {405ms} ZdcSecureSocketStream(
> ZdcAbstractSocketStream)>>socketWaitForData
>         |
>                              |  |      2.2% {405ms} Socket>>waitForDataFor:
>         |
>                              |  |        2.2% {405ms}
> Socket>>waitForDataFor:ifClosed:ifTimedOut:
>         |
>                              |  |          2.2% {405ms}
> Semaphore>>waitTimeoutMSecs:
>         |
>                              |  |            2.2% {405ms}
> DelayWaitTimeout>>wait
>         |
>                              |  |              2.2% {405ms}
> BlockClosure>>ensure:
>         |
>                              |  |                2.2% {405ms}
> DelayWaitTimeout>>wait
>         |
>                              |  |                  1.7% {314ms}
> DelayWaitTimeout(Delay)>>unschedule
>         |
>                              |  |                    1.7% {314ms}
> DelayExperimentalSpinScheduler>>unschedule:
>         |
>                              |3.2% {592ms} BlockClosure>>on:do:
>         |
>                              |  3.2% {592ms} ZdcSecureSocketStream(
> ZdcSimpleSocketStream)>>fillReadBuffer
>         |
>                              |    3.2% {592ms} ZdcSecureSocketStream(
> ZdcAbstractSocketStream)>>socketWaitForData
>         |
>                              |      3.2% {592ms} Socket>>waitForDataFor:
>         |
>                              |        3.2% {592ms} Socket>>waitForDataFor:
> ifClosed:ifTimedOut:
>         |
>                              |          3.2% {592ms}
> Semaphore>>waitTimeoutMSecs:
>         |
>                              |            3.2% {592ms}
> DelayWaitTimeout>>wait
>         |
>                              |              3.2% {592ms}
> BlockClosure>>ensure:
>         |
>                              |                3.2% {592ms}
> DelayWaitTimeout>>wait
>         |
>                              |                  2.3% {429ms}
> DelayWaitTimeout(Delay)>>unschedule
>         |
>                              |                    2.3% {429ms}
> DelayExperimentalSpinScheduler>>unschedule:
>         |
>                            4.7% {876ms} BlockClosure>>on:do:
>         |
>                              4.7% {876ms} ZdcSecureSocketStream(
> ZdcSimpleSocketStream)>>fillReadBuffer
>         |
>                                4.7% {876ms} ZdcSecureSocketStream(
> ZdcAbstractSocketStream)>>socketWaitForData
>         |
>                                  4.7% {876ms} Socket>>waitForDataFor:
>         |
>                                    4.7% {876ms} Socket>>waitForDataFor:
> ifClosed:ifTimedOut:
>         |
>                                      4.7% {876ms}
> Semaphore>>waitTimeoutMSecs:
>         |
>                                        4.7% {876ms} DelayWaitTimeout>>wait
>         |
>                                          4.7% {876ms} BlockClosure>>ensure:
>         |
>                                            4.7% {876ms}
> DelayWaitTimeout>>wait
>         |
>                                              2.9% {532ms}
> DelayWaitTimeout(Delay)>>unschedule
>         |
>                                                |2.9% {532ms}
> DelayExperimentalSpinScheduler>>unschedule:
>         |
>                                              1.4% {268ms} primitives
>       10.8% {2002ms} NeoJSONObject class>>fromString:
>         10.8% {2002ms} NeoJSONReader>>next
>           10.8% {2002ms} NeoJSONReader>>parseValue
>             10.8% {2002ms} NeoJSONReader>>parseList
>               10.8% {2002ms} Array class(SequenceableCollection
> class)>>streamContents:
>                 10.8% {2002ms} Array class(SequenceableCollection
> class)>>new:streamContents:
>                   10.8% {2002ms} NeoJSONReader>>parseList
>                     10.8% {2002ms} NeoJSONReader>>parseListElementsDo:
>                       10.8% {2002ms} NeoJSONReader>>parseListDo:
>                         10.8% {2002ms} NeoJSONReader>>parseListElementsDo:
>                           10.8% {2002ms} NeoJSONReader>>parseValue
>                             10.8% {2002ms} NeoJSONReader>>parseMap
>                               10.8% {2002ms} NeoJSONReader>>
> parseMapKeysAndValuesDo:
>                                 10.8% {2002ms}
> NeoJSONReader>>parseMapKeysDo:
>                                   10.8% {2002ms} NeoJSONReader>>parseMapDo:
>                                     10.7% {1994ms}
> NeoJSONReader>>parseMapKeysDo:
>                                       9.6% {1785ms} NeoJSONReader>>
> parseMapKeysAndValuesDo:
>                                         |9.2% {1717ms}
> NeoJSONReader>>parseValue
>                                         |  8.6% {1600ms}
> NeoJSONReader>>parseMap
>                                         |    8.6% {1600ms} NeoJSONReader>>
> parseMapKeysAndValuesDo:
>                                         |      8.6% {1600ms}
> NeoJSONReader>>parseMapKeysDo:
>                                         |        8.6% {1600ms}
> NeoJSONReader>>parseMapDo:
>                                         |          8.5% {1577ms}
> NeoJSONReader>>parseMapKeysDo:
>                                         |            6.4% {1187ms}
> NeoJSONReader>>parseMapKeysAndValuesDo:
>                                         |              |5.6% {1041ms}
> NeoJSONReader>>parseValue
>                                         |              |  3.8% {708ms}
> NeoJSONReader>>parseList
>                                         |              |    3.8% {706ms}
> Array class(SequenceableCollection class)>>streamContents:
>                                         |              |      3.8% {706ms}
> Array class(SequenceableCollection class)>>new:streamContents:
>                                         |              |        3.7%
> {693ms} NeoJSONReader>>parseList
>                                         |              |          3.7%
> {693ms} NeoJSONReader>>parseListElementsDo:
>                                         |              |            3.7%
> {693ms} NeoJSONReader>>parseListDo:
>                                         |              |              3.7%
> {689ms} NeoJSONReader>>parseListElementsDo:
>                                         |              |
>  3.7% {689ms} NeoJSONReader>>parseValue
>                                         |              |
>  3.7% {687ms} NeoJSONReader>>parseMap
>                                         |              |
>  3.7% {687ms} NeoJSONReader>>parseMapKeysAndValuesDo:
>                                         |              |
>    3.7% {687ms} NeoJSONReader>>parseMapKeysDo:
>                                         |              |
>      3.7% {687ms} NeoJSONReader>>parseMapDo:
>                                         |              |
>        3.6% {672ms} NeoJSONReader>>parseMapKeysDo:
>                                         |              |
>          3.0% {550ms} NeoJSONReader>>parseMapKeysAndValuesDo:
>                                         |              |
>            2.6% {486ms} NeoJSONReader>>parseValue
>                                         |              |
>              1.5% {285ms} NeoJSONReader>>parseMap
>                                         |              |
>                1.5% {285ms} NeoJSONReader>>parseMapKeysAndValuesDo:
>                                         |              |
>                  1.5% {285ms} NeoJSONReader>>parseMapKeysDo:
>                                         |              |
>                    1.5% {285ms} NeoJSONReader>>parseMapDo:
>                                         |              |
>                      1.5% {285ms} NeoJSONReader>>parseMapKeysDo:
>                                         |              |
>                        1.4% {252ms} NeoJSONReader>>
> parseMapKeysAndValuesDo:
>                                         |              |
>                          1.3% {236ms} NeoJSONReader>>parseValue
>                                         |              |
>                            1.0% {193ms} NeoJSONReader>>parseMap
>                                         |              |
>                              1.0% {193ms} NeoJSONReader>>
> parseMapKeysAndValuesDo:
>                                         |              |
>                                1.0% {193ms} NeoJSONReader>>parseMapKeysDo:
>                                         |              |
>                                  1.0% {188ms} NeoJSONReader>>parseMapDo:
>                                         |            1.9% {347ms}
> NeoJSONReader>>parsePropertyName
>                                         |              1.1% {196ms}
> NeoJSONReader>>parseValue
>                                         |                1.0% {189ms}
> NeoJSONReader>>parseString
>                                       1.0% {189ms} NeoJSONReader>>
> parsePropertyName
> --------------------------------
> Process: other processes
> --------------------------------
> 73.2% {13628ms} ProcessorScheduler class>>startUp
>   |73.2% {13628ms} ProcessorScheduler class>>idleProcess
> 1.4% {259ms} WeakArray class>>restartFinalizationProcess
>   1.4% {259ms} WeakArray class>>finalizationProcess
>     1.4% {257ms} primitives
> **Leaves**
> 73.3% {13631ms} ProcessorScheduler class>>idleProcess
> 10.0% {1861ms} DelayExperimentalSpinScheduler>>unschedule:
> 3.1% {581ms} DelayWaitTimeout>>wait
> 1.4% {257ms} WeakArray class>>finalizationProcess
> 1.0% {191ms} WeakSet>>scanFor:
>
> **Memory**
> old +16,777,216 bytes
> young -17,303,480 bytes
> used -526,264 bytes
> free +17,303,480 bytes
>
> **GCs**
> full 1 totalling 247ms (1.0% uptime), avg 247.0ms
> incr 127 totalling 199ms (1.0% uptime), avg 2.0ms
> tenures 480,033 (avg 0 GCs/tenure)
> root table 0 overflows
>
>
> Thanks in advance,
> Vitor
>

Reply via email to