Hello
Environment:
dotnet core 2.2
ss 5.6.0
ubuntu
Scenario:
Mapped virtual files source on folder with 1.500.000+ images
AddVirtualFileSources.Add(new FileSystemMapping(imagesWebRootPath, imagesOsRootPath));
_layout.html
...
{{ (debug ? '' : '[hash].min') | assignTo: min }}
{{ [ '!/assets/css/default.css', '/assets/css/' ] | bundleCss({ disk:!debug, out:`/css/lib.bundle${min}.css` }) }}
{{ [ '/assets/css/default.css'] | bundleCss({ minify:!debug, cache:!debug, disk:!debug, out:`/css/bundle${min}.css` }) }}
...
{{ [ '!/assets/js/default.js', '/assets/js/' ] | bundleJs({ disk:!debug, out:`/js/lib.bundle${min}.js` }) }}
{{ [ '/assets/js/default.js' ] | bundleJs({ minify:!debug, cache:!debug, disk:!debug, out:`/js/bundle${min}.js` }) }}
Im having a following problem:
on application starting cpu is 100% for long time (more than 60 secs)
I’m getting “Application started” in console but website is not available as log as cpu is high
once “scanning” is finished I can access website
this happens only when bundle files not exists, if files exists everything works as it should
When I turn off bundling of css and js, app is starting in few seconds.
While starting app it appears that bundleCss/Js is scaning virtual files source folder also, which is not stated in bundle configuration.
Kind regards
mythz
August 28, 2019, 11:48am
2
The scan may be coming from usage of wildcard directories, e.g. /assets/css/
and /assets/js/
in which case you can try specifying the files individually to avoid the scan.
Alternatively you can specify which VFS provider you want to use , e.g: filesystem:/assets/css/
will only search for the VFS FileSystem Provider from the WebRoot VirtualFilesSources. Alternatively you can use content:/wwwroot/assets/css/
to search usign the ContentRoot VirtualFiles provider.
Thank you for quick answer.
I have tried following, all without success:
specified each file individually for bundle*
tried to specify VFS provider for wildcard directory, both content and filesystem
To be a bit more specific about environment:
ubuntu linux server, on boot remote share is being mapped on local folder imagesOsRootPath
mapped folder have /year-month/year-month-day/ structure with 1.5+ million of files distributed trough last level folders
in AppHost Configure I am adding VFS as in first post
on app start I can see that dotnet process is starting to use cpu in high percentage
in matter of seconds process called cifsd (cifs mapped network share) is also starting to hog on cpu
while both processes are active (high cpu %), website does not response on requests
after some time (in my case about almost minute) a css folder is being created
after about same time needed for css, js folder is being created
cpu goes down (both dotnet and cifsd processess), website becomes available
this happens only when css and js folders do not exists, on next start app starts normally
app is also starting normally when not using bundle* (when each css and js file is stated regularly in html)
If you need any additional information that I may have overlooked please ask.
Regards
mythz
August 28, 2019, 1:50pm
4
I think it’s because you’re using a [hash]
, the bundle doesn’t know what the previous hash was so it does a wildcard search for matching files:
Can you confirm that it doesn’t do the file scan when not using a [hash]
placeholder? e.g:
{{ (debug ? '' : '.min') | assignTo: min }}
I can confirm that app is starting normally when not using [hash].
This leaves two questions open:
If not using hash, how to invalidate browser cached css and js bundles (after app update or similar)?
Is there a way to force bundle* to scan only wildcard directories specified in config, regardles of [hash] usage?
Thanks
mythz
August 28, 2019, 2:07pm
6
I’ll look into limiting the wildcard search, should be able to just manually inspect the files of that directory instead of doing a file search.
One way to avoid using the [hash]
and still have a cache-breaker is to add a version number in the bundle name, e.g:
{{ 'v2' | to => version }}
{{ [ '!/assets/css/default.css', '/assets/css/' ]
| bundleCss({ disk:!debug, out:`/css/lib.bundle.${version}.${min}.css` }) }}
1 Like
mythz
August 28, 2019, 8:44pm
7
ServiceStack now uses a manual glob search from this commit to avoid the file scan.
This change is available from v5.6.1 that’s now available on MyGet .
Everything works as expected. Thank you for such a quick response and fix.
1 Like