ArthurTaylor added a comment.

  I had a poke around at this the last days. Quick status update from my side.
  
  Running Quibble locally it's possible to reproduce the issue:
  
    mkdir -p src && mkdir -p cache && mkdir -p log && mkdir -p ref
    
    docker run --entrypoint=quibble-with-supervisord \
      --tmpfs /workspace/db:size=320M \
      --volume "$(pwd)"/src:/workspace/src \
      --volume "$(pwd)"/cache:/cache \
      --volume "$(pwd)"/log:/workspace/log \
      --volume "$(pwd)"/ref:/srv/git:ro \
      --security-opt seccomp=unconfined \
      --env-file=.env --init --rm \
      docker-registry.wikimedia.org/releng/quibble-buster-php74:1.6.0-s6 \
      --packages-source composer \
      --db mysql --db-dir /workspace/db \
      --git-parallel=8 \
      --run qunit
  
  `.env`:
  
    ZUUL_PROJECT=mediawiki/extensions/Wikibase
    ZUUL_BRANCH=REL1_40
    EXT_NAME=Wikibase
    SKIN_DEPENDENCIES=mediawiki/skins/MinervaNeue\nmediawiki/skins/Vector
    
EXT_DEPENDENCIES=mediawiki/extensions/CirrusSearch\nmediawiki/extensions/VisualEditor\nmediawiki/extensions/Wikibase\nmediawiki/extensions/Scribunto\nmediawiki/extensions/Elastica\nmediawiki/extensions/Echo\nmediawiki/extensions/DiscussionTools\nmediawiki/extensions/Linter
  
  I created a local version of the Quibble container with XDebug enabled and 
was able to get this stack trace for the failed request: F42443515: 
load-php-request-failed-trace.php.html 
<https://phabricator.wikimedia.org/F42443515>
  
  I've also been able to generate profiler output for failed and successful 
requests, but they are ~400MB in size so I will not include them here.
  
  Running the QUnit tests hits the 128MB memory limit for the container when a 
request like this needs to be served:
  
    
http://127.0.0.1:9413/load.php?modules=mediawiki.language%2CmessagePoster%2Cpulsatingdot%2Cqunit-testrunner%2Crouter%2Cstorage%2Ctemplate%2Ctoc%2Cuser%2Cutil%2CvisibleTimeout%2Cwidgets%7Cmediawiki.language.months%2Cnames%2CspecialCharacters%2Ctestdata%7Cmediawiki.libs.guiders%2Cjpegmeta%2Cpluralruleparser%7Cmediawiki.page.gallery.styles%7Cmediawiki.page.ready%7Cmediawiki.page.watch.ajax%7Cmediawiki.rcfilters.filters.ui%7Cmediawiki.skinning.content.parsoid%7Cmediawiki.template.handlebars%2Cmustache%2Cvue%7Cmediawiki.ui.button%2Cicon%7Cmediawiki.widgets.AbandonEditDialog%2CCategoryMultiselectWidget%2CDateInputWidget%2CMediaSearch%2CTable%2CUserInputWidget%2Cstyles%7Cmediawiki.widgets.DateInputWidget.styles%7Cmobile.ooui.icons%7Cmobile.pagelist.styles%7Cmobile.pagesummary.styles%7Cmobile.placeholder.images%7Cmobile.startup%7Cmobile.startup.images%7Cmoment%2Coojs%2Coojs-ui%2Coojs-ui-core%2Coojs-ui-toolbars%2Coojs-ui-widgets%2Coojs-ui-windows%2Cpapaparse%2Crangefix%2Csinonjs%2Cspark-md5%2CtreeDiffer%2Cunicodejs%2CvalueFormatters%2CvalueParsers%7Cmw.config.values.wbDataTypes%2CwbRefTabsEnabled%2CwbRepo%2CwbSiteDetails%7Coojs-ui-core.icons%2Cstyles%7Coojs-ui-toolbars.icons%7Coojs-ui-widgets.icons%7Coojs-ui-windows.icons%7Coojs-ui.styles.icons-accessibility%2Cicons-alerts%2Cicons-content%2Cicons-editing-advanced%2Cicons-editing-citation%2Cicons-editing-core%2Cicons-editing-list%2Cicons-editing-styling%2Cicons-interactions%2Cicons-layout%2Cicons-media%2Cicons-moderation%2Cicons-movement%2Cicons-user%2Cindicators%7Cskins.minerva.messageBox.styles%7Csocket.io%7Ctest.ArticlePlaceholder%2CCentralAuth%2CCite%2CDiscussionTools%2CEcho%2CEventLogging%2CFlow%2CGuidedTour%2CMediaWiki%2CMinervaNeue%2CTemplateData%2CThanks%2CUniversalLanguageSelector%2CVisualEditor%2CWikiEditor%2CWikibaseClient%2CWikibaseLexeme%2CWikibaseRepository%2CWikimediaEvents%7Cutil.ContentLanguages%2CExtendable%2CMessageProvider%2CMessageProviders%2CNotifier%2ChighlightSubstring%2Cinherit%7CvalueParsers.ValueParserStore%2Cparsers&version=1a741http://127.0.0.1:9413/load.php?modules=mediawiki.language%2CmessagePoster%2Cpulsatingdot%2Cqunit-testrunner%2Crouter%2Cstorage%2Ctemplate%2Ctoc%2Cuser%2Cutil%2CvisibleTimeout%2Cwidgets%7Cmediawiki.language.months%2Cnames%2CspecialCharacters%2Ctestdata%7Cmediawiki.libs.guiders%2Cjpegmeta%2Cpluralruleparser%7Cmediawiki.page.gallery.styles%7Cmediawiki.page.ready%7Cmediawiki.page.watch.ajax%7Cmediawiki.rcfilters.filters.ui%7Cmediawiki.skinning.content.parsoid%7Cmediawiki.template.handlebars%2Cmustache%2Cvue%7Cmediawiki.ui.button%2Cicon%7Cmediawiki.widgets.AbandonEditDialog%2CCategoryMultiselectWidget%2CDateInputWidget%2CMediaSearch%2CTable%2CUserInputWidget%2Cstyles%7Cmediawiki.widgets.DateInputWidget.styles%7Cmobile.ooui.icons%7Cmobile.pagelist.styles%7Cmobile.pagesummary.styles%7Cmobile.placeholder.images%7Cmobile.startup%7Cmobile.startup.images%7Cmoment%2Coojs%2Coojs-ui%2Coojs-ui-core%2Coojs-ui-toolbars%2Coojs-ui-widgets%2Coojs-ui-windows%2Cpapaparse%2Crangefix%2Csinonjs%2Cspark-md5%2CtreeDiffer%2Cunicodejs%2CvalueFormatters%2CvalueParsers%7Cmw.config.values.wbDataTypes%2CwbRefTabsEnabled%2CwbRepo%2CwbSiteDetails%7Coojs-ui-core.icons%2Cstyles%7Coojs-ui-toolbars.icons%7Coojs-ui-widgets.icons%7Coojs-ui-windows.icons%7Coojs-ui.styles.icons-accessibility%2Cicons-alerts%2Cicons-content%2Cicons-editing-advanced%2Cicons-editing-citation%2Cicons-editing-core%2Cicons-editing-list%2Cicons-editing-styling%2Cicons-interactions%2Cicons-layout%2Cicons-media%2Cicons-moderation%2Cicons-movement%2Cicons-user%2Cindicators%7Cskins.minerva.messageBox.styles%7Csocket.io%7Ctest.ArticlePlaceholder%2CCentralAuth%2CCite%2CDiscussionTools%2CEcho%2CEventLogging%2CFlow%2CGuidedTour%2CMediaWiki%2CMinervaNeue%2CTemplateData%2CThanks%2CUniversalLanguageSelector%2CVisualEditor%2CWikiEditor%2CWikibaseClient%2CWikibaseLexeme%2CWikibaseRepository%2CWikimediaEvents%7Cutil.ContentLanguages%2CExtendable%2CMessageProvider%2CMessageProviders%2CNotifier%2ChighlightSubstring%2Cinherit%7CvalueParsers.ValueParserStore%2Cparsers&version=1a741
  
  In particular, loading the modules and dependencies for the 
`test.DiscussionTools` QUnit tests loads in about 150 files, some of which are 
many megabytes in size. The ResourceLoader loads these from disk into memory, 
duplicates the strings in memory while it wraps and unwraps them in `XmlJsCode` 
objects (`HtmlJsCode` on master), and it's eventually a call to `implode` just 
before the output is sent to the client which causes the process to ask for too 
much memory. The memory usage is not helped by the fact that the `Module` 
objects keep a cache of the content, and the `ResourceLoader` keeps a cache of 
modules. So my working theory is that in the first pass, where we have to warm 
those caches and manipulate all the strings in memory, for particularly long 
module lists, there are just too many bytes involved.
  
  My plan for next week is to attach `gdb` and get a heap dump to see where all 
the memory is going. There might be some low-hanging fruit for optimising the 
way we use memory.
  
  Also worth noting:
  
  - Running Quibble without php-fpm doesn't have this issue. I'm not currently 
sure why this is - it could be an implementation quirk, or it could be that 
we're right at the boundary of the 128MB and `php-fpm` just has a little bit 
extra overhead. I haven't looked deeply into the memory accounting there
  - Making a second request to the same URL works fine. Presumably serving the 
modules from the heap-cached `Module` objects uses less memory than streaming 
them in from disk and generating the memory representation and caching that 
before serving the module.

TASK DETAIL
  https://phabricator.wikimedia.org/T356896

EMAIL PREFERENCES
  https://phabricator.wikimedia.org/settings/panel/emailpreferences/

To: ArthurTaylor
Cc: karapayneWMDE, Lucas_Werkmeister_WMDE, Aklapper, Michael, 
Danny_Benjafield_WMDE, Astuthiodit_1, Invadibot, maantietaja, ItamarWMDE, 
Akuckartz, Nandana, Lahi, Gq86, GoranSMilovanovic, QZanden, cmadeo, KimKelting, 
LawExplorer, _jensen, rosalieper, Scott_WUaS, Wikidata-bugs, aude, jayvdb, 
Ricordisamoa, Mbch331
_______________________________________________
Wikidata-bugs mailing list -- wikidata-bugs@lists.wikimedia.org
To unsubscribe send an email to wikidata-bugs-le...@lists.wikimedia.org

Reply via email to