Yesterday, I did performance analysis for one project. This is the output of mpstat
command for old version:
And this is the CPU
utilisation for new version:
For new version, the iowait
ratio is remarkably high. After Checking the code, I found the original serialisation was just a fflush, but now for some reasons, it was replaced by fdatasync which is a blocking API and only returns when the data is transferred to the storage device. Therefore the thread which invokes fdatasync
will be stuck there and can’t process any other message. So we must pay attention to use blocking IO
APIs, sometimes they may bring you results which you don’t want.