Thanks for the answers!

If this is time spent on I/O it is really strange. I am consuming the
Twitter API and it don't get so much time like this to get a response.
Besides, while those profiles were made at a Windows 10 local machine, the
same code on a Pharo 5 (get.pharo.org) deployed on a linux deploy on
Digital Ocean takes ~6 seconds, which means that a lot less time is spent
on I/O. Isn't that Strange? I will try to spin up a local linux machine
with both a headfull and headless Pharo to see if this time changes.

Is there a way to profile a remote image? I would like to see what is
happening in the Digital Ocean deploy. Maybe put the headless Pharo there
in profiling mode?

Ben: this is a heavy json parser procedure, I would expect to NeoJson to
take some time. Perhaps there is a way to optimize this, but what catch my
attention was the huge amount of time spent on the idleProcess. Been that
I/O wait, it shouldn't be like this.

Thanks,
Vitor

On Thu, Sep 8, 2016 at 4:42 AM, Clément Bera <bera.clem...@gmail.com> wrote:

>
>
> 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(Twee
>> tsService)>>hashesTop:usingLastTweetsUpTo:fromHandler:
>>     25.0% {4656ms} TweetsServiceRestConsumer>>fet
>> chLastTweetsUpTo:fromHandler:
>>       14.3% {2653ms} OAuthProvider>>httpGet:
>>         |14.3% {2653ms} ZnOAuth1Service>>httpGet:using:
>>         |  14.3% {2653ms} ZnOAuth1Service>>executeRequest:token:
>>         |    14.3% {2653ms} ZnOAuth1Service>>executeReques
>> t: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(DynamicVariab
>> le)>>value:during:
>>         |              14.2% {2646ms} BlockClosure>>ensure:
>>         |                14.2% {2646ms} ZnSignalProgress(DynamicVariab
>> le)>>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:starti
>> ngAt:count:fromStream:
>>         |
>>                    13.7% {2550ms} ZnUTF8Encoder>>optimizedReadIn
>> to:startingAt:count:fromStream:
>>         |
>>                      13.7% {2550ms} ZnLimitedReadStream>>readInto:
>> startingAt:count:
>>         |
>>                        13.7% {2547ms} ZdcSecureSocketStream(ZdcOptim
>> izedSocketStream)>>readInto:startingAt:count:
>>         |
>>                          13.7% {2547ms} ZdcSecureSocketStream(ZdcSimpl
>> eSocketStream)>>fillReadBuffer
>>         |
>>                            9.0% {1669ms} ZdcSecureSocketStream(ZdcSimpl
>> eSocketStream)>>fillReadBuffer
>>         |
>>                              |5.8% {1076ms} ZdcSecureSocketStream(ZdcSimpl
>> eSocketStream)>>fillReadBuffer
>>         |
>>                              |  |3.6% {671ms} ZdcSecureSocketStream(ZdcSimpl
>> eSocketStream)>>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(ZdcSimpl
>> eSocketStream)>>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(ZdcSimpl
>> eSocketStream)>>fillReadBuffer
>>         |
>>                                4.7% {876ms} ZdcSecureSocketStream(ZdcAbstr
>> actSocketStream)>>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>>parseListElemen
>> tsDo:
>>                           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>>parseMapKeysAnd
>> ValuesDo:
>>                                         |              |
>>                            1.3% {236ms} NeoJSONReader>>parseValue
>>                                         |              |
>>                              1.0% {193ms} NeoJSONReader>>parseMap
>>                                         |              |
>>                                1.0% {193ms} NeoJSONReader>>parseMapKeysAnd
>> ValuesDo:
>>                                         |              |
>>                                  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