View Issue Details

IDProjectCategoryView StatusLast Update
0001701XdebugStep Debuggingpublic2020-03-12 16:43
Reporterbarel Assigned Toderick  
PriorityhighSeveritymajorReproducibilityalways
Status resolvedResolutionno change required 
PlatformDocker linuxOSMACOS VersionMojave
Product Version2.7.2 
Summary0001701: Slowness due to calls to getTimeOfDay
Description

When running xDebug within a docker container under MAC OS the performance is very degraded, much worse than the usual (and expected) degraded performance. This is due to the way that calls to getTimeOfDay is handled by the system in this setup, as described here https://github.com/docker/for-mac/issues/3455

Under this setup these calls are very slow and account for most of the degradation in performance. We confirmed this by rebuilding Xdebug and removing the call to this function that is done in xdebug_get_utime in usefulstuff.c

Here are the results of our benchmark of running a symfony command

Without Xdebug: 15s
With Xdebug and calling getTimeOfDay: 6m30s
With Xdebug and without calling getTimeOfDay: 2m10s

As you can see the extra degradation in performance is huge.

This call to getTimeOfDay is done by xdebug_add_stack_frame to save this data into the time field in the stack entry. This only seems to be used when printing stack traces. I guess that 99% of users are not interested in this data. If there was a way of disabling calling xdebug_get_utime within this function this should solve the issue for the majority of users

Proposed solutions:

  • Add a new config setting to enable or disable saving the time in the stack frame. (enabled for BC compatibility), OR
  • Only perform this call if tracing is enabled for the current context
Steps To Reproduce

Enable xdebug in a docker container running PHP under MAC OS. Run any process. It will be more than 2x slower than the same process not running under this setup

Tagsperformance
Operating SystemMAC OS
PHP Version7.1.20-7.1.24

Activities

derick

2019-09-16 16:43

administrator   ~0005141

I can't reproduce this myself, as I don't have a Mac.

I am reluctant to add a specific setting for this, as there are already too many settings in Xdebug. My plan for Xdebug 3 is to drastically reduce the amount of settings as well.

As the timestamps form part of the stack traces that Xdebug generates, this data needs to be collected for each function call. I'm happy to use a different clock-getting-function on OSX, besides gettimeofday() if one exists.

derick

2019-10-07 14:57

administrator   ~0005169

Hi,

Thanks for your report. After reading the explanation that you've linked, and think a bit more about this, I have come to the conclusion that I do not want to add a new setting as a workaround a bug in Docker on Mac. This should definitely be fixed on their site, and their bug also does not exclusively hit Xdebug.

cheers,
Derick

jimbojsb

2020-02-14 02:50

reporter   ~0005244

Hey Derick,

Docker have basically said they are unable to resolve this as its several layers of abstraction above their access to the system hypervisor. I don't disagree that a config option seems very, very niche in this case, but would you entertain a PR that makes it a compile time flag? As is, I'm just going to patch a local build to define HAVE_GETTIMEOFDAY to false and compile it from source, but would rather not have to keep a patched source tree in sync.

Issue History

Date Modified Username Field Change
2019-09-14 12:06 barel New Issue
2019-09-14 12:06 barel Tag Attached: performance
2019-09-16 16:43 derick Note Added: 0005141
2019-10-07 14:57 derick Assigned To => derick
2019-10-07 14:57 derick Status new => resolved
2019-10-07 14:57 derick Resolution open => no change required
2019-10-07 14:57 derick Note Added: 0005169
2020-02-14 02:50 jimbojsb Note Added: 0005244
2020-03-12 16:43 derick Category Feature/Change request => Step Debugging