1. Не понятно, в каком именно моменте времени проблема. Занимаемая оперативная память увеличилась на 3мб ПОСЛЕ отправки всего файла, В МОМЕНТ отправки файла?
2. То, что съедает чуть больше самого файла - так все правильно, есть же еще память, которая тратится на сопутствующие объекты кода - создание FileRequest, внутри других методов всякие обертки (как для UnsafeWrap). Если по итогам закачки файла память занимаемая увеличилась на 3мб - значит еще Garabge Collector не очистил массив _part
3. Для чего нужно делать
FileBytes = Google.Protobuf.UnsafeByteOperations.UnsafeWrap(_part)
? Ведь итак и так отправляется массив байт? Вроде по описанию там просто объект обертки создается для масива.
4 Ну и сама утечка
_part = new byte[ms.Length - ms.Position];
- тут при медленной скорости может создаваться массив несколько раз.