swift-nio-extras/Sources/NIOExtrasPerformanceTester/HTTP1PCAPPerformanceTests.swift
Peter Adams 0f878f95f0
Performance testing for NIO PCAP logging (#98)
Motivation:

It's useful to know the overhead we could be adding by including
the PCAP handler.

Modifications:

Add a new executable based on the NIO performance testing executable.

Result:

There is a new executable which runs a short test of sending and receiving
data through the HTTP/1 handler using multiple eventloops and showing
three options.
1) Vanilla
2) With in memory PCAP never written to disk
3) With a disk based PCAP.
2020-08-03 12:13:24 +01:00

62 lines
2.0 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the SwiftNIO open source project
//
// Copyright (c) 2020 Apple Inc. and the SwiftNIO project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of SwiftNIO project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//
import NIO
import NIOExtras
import Foundation
class HTTP1ThreadedPCapPerformanceTest: HTTP1ThreadedPerformanceTest {
private class SinkHolder {
var fileSink: NIOWritePCAPHandler.SynchronizedFileSink!
func setUp() throws {
let outputFile = NSTemporaryDirectory() + "/" + UUID().uuidString
self.fileSink = try NIOWritePCAPHandler.SynchronizedFileSink.fileSinkWritingToFile(path: outputFile) { error in
print("ERROR: \(error)")
exit(1)
}
}
func tearDown() {
try! self.fileSink.syncClose()
}
}
init() {
let sinkHolder = SinkHolder()
func addPCap(channel: Channel) -> EventLoopFuture<Void> {
let pcapHandler = NIOWritePCAPHandler(mode: .client,
fileSink: sinkHolder.fileSink.write)
return channel.pipeline.addHandler(pcapHandler, position: .first)
}
self.sinkHolder = sinkHolder
super.init(numberOfRepeats: 50,
numberOfClients: System.coreCount,
requestsPerClient: 500,
extraInitialiser: { channel in return addPCap(channel: channel) })
}
private let sinkHolder: SinkHolder
override func run() throws -> Int {
// Opening and closing the file included here as flushing data to disk is not known to complete until closed.
try sinkHolder.setUp()
defer {
sinkHolder.tearDown()
}
return try super.run()
}
}