The 100% CPU spike is likely the cause of the slow performance. I think a reasonable strategy might be to turn on profiling in Zope 2.7 (see zope.conf profile-publisher? key, and Control_Panel -> Debug) to see what falls out of that. I'm sure there's a lot of information about this if you google for "zope profiling".
When the time is spent in ZServer (rather than Zope itself), the profiler will not be able to report this. When I (once) analysed the timing behaviour of an 80 MB file upload, Zope itself used only a small proportion of the complete time. It turned out that "ZPublisher.Client" was responsible for most of the total time (which was used as upload client). It is not designed for large object transfer and forced the computer into swapping. -- Dieter