followup
This commit is contained in:
parent
b9aa2ce8d1
commit
824b147286
3 changed files with 114 additions and 0 deletions
|
@ -0,0 +1,12 @@
|
|||
[[!comment format=mdwn
|
||||
username="joey"
|
||||
subject="""comment 10"""
|
||||
date="2021-09-28T17:57:50Z"
|
||||
content="""
|
||||
Since my profiling above shows windows is as fast as linux (though
|
||||
probably on faster hardware), one thing I am wondering is if antivirus
|
||||
could be slowing it down. I know AV on windows can slow down things like
|
||||
writing to files, because it blocks closing the file until it finishes
|
||||
scanning. Maybe the github windows CI does not run AV, but your windows
|
||||
does, mih?
|
||||
"""]]
|
|
@ -0,0 +1,58 @@
|
|||
[[!comment format=mdwn
|
||||
username="joey"
|
||||
subject="""comment 8"""
|
||||
date="2021-09-28T16:22:36Z"
|
||||
content="""
|
||||
Corresponding time profile on Windows. This was run on a github CI
|
||||
instance, so I don't know if the CPU was busy with other tasks.
|
||||
|
||||
Mon Sep 27 22:45 2021 Time and Allocation Profiling Report (Final)
|
||||
|
||||
git-annex.exe +RTS -p -RTS smudge --clean x
|
||||
|
||||
total time = 0.02 secs (22 ticks @ 1000 us, 1 processor)
|
||||
total alloc = 6,753,624 bytes (excludes profiling overheads)
|
||||
|
||||
COST CENTRE MODULE SRC %time %alloc
|
||||
|
||||
createProcess Utility.Process Utility\Process.hs:(177,1)-(180,16) 50.0 18.7
|
||||
openLock.\ Utility.LockFile.Windows Utility\LockFile\Windows.hs:(64,17)-(65,76) 4.5 0.0
|
||||
toInodeCache' Utility.InodeCache Utility\InodeCache.hs:(196,1)-(206,34) 4.5 3.0
|
||||
checkSentinalFile.loadoldcache Utility.InodeCache Utility\InodeCache.hs:(260,9)-(261,83) 4.5 0.3
|
||||
adjustGitEnv Git.Env Git\Env.hs:(18,1)-(22,7) 4.5 41.2
|
||||
pipeReadStrict'.go Git.Command Git\Command.hs:(80,9)-(85,37) 4.5 0.1
|
||||
mergeGitConfig Types.GitConfig Types\GitConfig.hs:(284,1)-(299,54) 4.5 0.0
|
||||
fixupRepo Annex.Fixup Annex\Fixup.hs:(37,1)-(42,31) 4.5 0.0
|
||||
noCommit Command Command.hs:56:1-37 4.5 0.0
|
||||
getFileSize System.PosixCompat.Files src\System\PosixCompat\Files.hsc:(358,1)-(359,76) 4.5 1.5
|
||||
searchParser Options.Applicative.Common src\Options\Applicative\Common.hs:(136,1)-(151,40) 4.5 0.2
|
||||
catch Control.Monad.Catch src\Control\Monad\Catch.hs:333:3-32 4.5 0.2
|
||||
getFileSize Utility.FileSize Utility\FileSize.hs:37:1-80 0.0 1.5
|
||||
getFileType System.PosixCompat.Files src\System\PosixCompat\Files.hsc:(350,1)-(355,62) 0.0 2.9
|
||||
getFileStatus System.PosixCompat.Files src\System\PosixCompat\Files.hsc:(312,1)-(337,24) 0.0 6.0
|
||||
unconsB Codec.Binary.UTF8.Generic Codec\Binary\UTF8\Generic.hs:297:1-18 0.0 1.2
|
||||
|
||||
(Whole profile at <https://tmp.joeyh.name/windows-profile>)
|
||||
|
||||
What stands out is that createProcess is twice as expensive as linux, and
|
||||
fully half the runtime is apparently spent just forking a few processes.
|
||||
|
||||
Here are the git processes started and percent of time to start them,
|
||||
from the more detailed profiling:
|
||||
|
||||
git config 9%
|
||||
git cat-file 9%
|
||||
git check-attr 4.5%
|
||||
git diff (reconcileStaged) 9%
|
||||
git show-ref (reconcileStaged) 9%
|
||||
git write-tree (reconcileStaged) 9%
|
||||
|
||||
(The reconcileStaged stuff only happened because `git init`
|
||||
didn't do it -- I forgot to put git-annex in the path the way I ran it
|
||||
on the CI builder, and so init didn't do everything it usually would.
|
||||
A second run with that fixed had a createProcess percent reduced to 30%,
|
||||
though still at around2 0.2s total runtime.)
|
||||
|
||||
This is not super slow on the Windows CI, it's competative with Linux,
|
||||
though my Linux laptop probably has a slower CPU (1.5ghz).
|
||||
"""]]
|
|
@ -0,0 +1,44 @@
|
|||
[[!comment format=mdwn
|
||||
username="joey"
|
||||
subject="""comment 9"""
|
||||
date="2021-09-28T17:09:21Z"
|
||||
content="""
|
||||
So most of the time is spent in createProcess. Forking is not slow
|
||||
(on linux anyway) so why are 4 createProcess 23% of runtime on linux?
|
||||
|
||||
Here is a strace --relative-timestamps on linux, showing a single createProcess
|
||||
call, for reading `git config`.
|
||||
|
||||
0.000196 pipe([11, 12]) = 0
|
||||
0.000134 pipe([13, 14]) = 0
|
||||
0.000067 rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
|
||||
0.000074 vfork() = 1412528
|
||||
0.000552 close(12) = 0
|
||||
0.000058 fcntl(11, F_SETFD, FD_CLOEXEC) = 0
|
||||
0.000095 close(14) = 0
|
||||
0.000050 fcntl(13, F_SETFD, FD_CLOEXEC) = 0
|
||||
0.000047 read(13, "", 4) = 0
|
||||
0.000050 close(13) = 0
|
||||
0.000061 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
|
||||
0.000062 futex(0x98336c8, FUTEX_WAKE_PRIVATE, 1) = 1
|
||||
0.000061 futex(0x9833660, FUTEX_WAKE_PRIVATE, 1) = 1
|
||||
0.000066 fcntl(11, F_GETFL) = 0 (flags O_RDONLY)
|
||||
0.000047 fcntl(11, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
|
||||
0.000073 ioctl(11, TCGETS, 0x7ffc091b0d80) = -1 ENOTTY (Inappropriate ioctl for device)
|
||||
|
||||
Total runtime of createProcess above is 1.69 ms.
|
||||
And from the profile on windows, it's taking around 1.7 ms per createProcess.
|
||||
|
||||
I'd say that at least 1.32 ms of that is necessary, leaving out the `futex`
|
||||
and `rt_sigprocmask` that are probably GHC runtime stuff, and the `ioctl`
|
||||
and `read` and `fcntl F_GETFL` which seem unnecessary.
|
||||
If those were optimised out, the total `git-annex smudge --clean`
|
||||
runtime would speed up by only 10% or so.
|
||||
|
||||
Feels like I've reached the end of profiling. Most of the time is being spent
|
||||
starting git processes, and it can't be sped up significantly without
|
||||
starting fewer git processes.
|
||||
|
||||
(I do wish that `git check-attr` could be removed, but it's needed for the
|
||||
annex.largefiles .gitattributes support.)
|
||||
"""]]
|
Loading…
Add table
Add a link
Reference in a new issue