>
> Why not ? You are doing (lot's of) network I/O. It is normal that your
> image code has to wait from time to time for data to come in from the
> network. By definition that is slow (in CPU terms). The Digital Ocean
> instance is probably faster in that respect.
>

But only the wait time corresponds to 73% (~13 seconds in no CPU time) of
the entire procedure, which is taking ~18 seconds total. In the remote
server the same procedure takes only ~6 seconds, supposing it still takes
73% in waiting it would give us ~4 seconds in wait time. I think 4 seconds
to 13 seconds of difference for wait time is too much, it is not? The
maximum I/O calls I am doing is ten. It is like it takes more than one
second waiting for response, which does not seems right. I will do
additional tests.


> Also, having the IDE UI with lot's of tools open might influence things.
> Best do some more experiments. But benchmarking is very tricky.


Yes, I will try doing different stuff here!

Thanks!
Vitor


On Thu, Sep 8, 2016 at 9:09 AM, Sven Van Caekenberghe <s...@stfx.eu> wrote:

>
> > On 08 Sep 2016, at 14:01, Vitor Medina Cruz <vitormc...@gmail.com>
> wrote:
> >
> > 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.
>
> Why not ? You are doing (lot's of) network I/O. It is normal that your
> image code has to wait from time to time for data to come in from the
> network. By definition that is slow (in CPU terms). The Digital Ocean
> instance is probably faster in that respect.
>
> Also, having the IDE UI with lot's of tools open might influence things.
> Best do some more experiments. But benchmarking is very tricky.
>
> > 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(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