From 7f0efe672bcf3973feb8faf5c77d86643e1cb102 Mon Sep 17 00:00:00 2001 From: Sandro Keil Date: Tue, 14 Jul 2020 17:14:22 +0200 Subject: [PATCH 01/12] Use PHP 7.4 --- docker-compose-arangodb.yml | 8 +++----- docker-compose-mariadb.yml | 2 +- docker-compose-mysql.yml | 2 +- docker-compose-postgres.yml | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/docker-compose-arangodb.yml b/docker-compose-arangodb.yml index eb77428..8a838e9 100644 --- a/docker-compose-arangodb.yml +++ b/docker-compose-arangodb.yml @@ -2,14 +2,13 @@ version: '2.3' services: # To run benchmark suite docker-compose run --rm php src/benchmark php: - image: prooph/php:7.2-cli + image: prooph/php:7.4-cli environment: DRIVER: "arangodb" - PHP_IDE_CONFIG: "serverName=application" ARANGODB_HOST: "tcp://database:8529" ARANGODB_USERNAME: "" ARANGODB_PASSWORD: "" - ARANGODB_DB: _system + ARANGODB_DB: event-store-bench volumes: - "./:/app" #cpuset: phpcpuset @@ -18,12 +17,11 @@ services: #mem_reservation: phpmem_reservation database: - image: arangodb:3.2 + image: arangodb:3.6.4 ports: - 8529:8529 environment: ARANGO_NO_AUTH: 1 - #ARANGO_STORAGE_ENGINE: rocksdb #cpuset: dbcpuset #cpu_count: dbcpu_count #mem_limit: dbmem_limit diff --git a/docker-compose-mariadb.yml b/docker-compose-mariadb.yml index e5113ca..7b979a7 100644 --- a/docker-compose-mariadb.yml +++ b/docker-compose-mariadb.yml @@ -2,7 +2,7 @@ version: '2.3' services: # To run benchmark suite docker-compose run --rm php src/benchmark php: - image: prooph/php:7.2-cli + image: prooph/php:7.4-cli environment: DRIVER: "mariadb" MARIADB_USER: "dev" diff --git a/docker-compose-mysql.yml b/docker-compose-mysql.yml index 3f7e429..13b98be 100644 --- a/docker-compose-mysql.yml +++ b/docker-compose-mysql.yml @@ -2,7 +2,7 @@ version: '2.3' services: # To run benchmark suite docker-compose run --rm php src/benchmark php: - image: prooph/php:7.2-cli + image: prooph/php:7.4-cli environment: DRIVER: "mysql" MYSQL_USER: "dev" diff --git a/docker-compose-postgres.yml b/docker-compose-postgres.yml index fa222db..8813f91 100644 --- a/docker-compose-postgres.yml +++ b/docker-compose-postgres.yml @@ -2,7 +2,7 @@ version: '2.3' services: # To run benchmark suite docker-compose run --rm php src/benchmark php: - image: prooph/php:7.2-cli + image: prooph/php:7.4-cli environment: DRIVER: "postgres" POSTGRES_USER: "dev" From 38ecb206a5fe16f93ef7f90cd2c193fc34bd5b16 Mon Sep 17 00:00:00 2001 From: Sandro Keil Date: Tue, 14 Jul 2020 17:14:44 +0200 Subject: [PATCH 02/12] Use tee to display output --- bench.sh | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/bench.sh b/bench.sh index 60e87e5..dacf3df 100755 --- a/bench.sh +++ b/bench.sh @@ -59,14 +59,14 @@ start=$(adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%07d", $2) }') while [ ${WRITER_COUNTER} -lt ${WRITER_ITERATIONS} ]; do for type in user post todo blog comment do - php src/writer.php writer${WRITER_COUNTER} ${type} >logs/writer${WRITER_COUNTER}${type}.log & + php src/writer.php writer${WRITER_COUNTER} ${type} | tee logs/writer${WRITER_COUNTER}${type}.log & done WRITER_COUNTER=$((WRITER_COUNTER + 1)) done for type in user post todo blog comment all do - php src/projector.php projectors${type} ${type} >logs/projector${type}.log & + php src/projector.php projectors${type} ${type} | tee logs/writer${WRITER_COUNTER}${type}.log & done echo "Waiting ... stay patient!" @@ -84,11 +84,6 @@ while [ ${WRITER_COUNTER} -lt ${WRITER_ITERATIONS} ]; do WRITER_COUNTER=$((WRITER_COUNTER + 1)) done -for type in user post todo blog comment all -do - cat logs/projector${type}.log -done - echo "" duration=$((end - start)) duration=$(printf ${duration} | awk '{ printf("%.08f\n", $1/1000000000.0) }' ) From 46e3c420a4af483bfcff4bfb061e9674e21906a5 Mon Sep 17 00:00:00 2001 From: Sandro Keil Date: Tue, 14 Jul 2020 17:17:46 +0200 Subject: [PATCH 03/12] Update dependencies for ArangoDB and remove not needed dependencies --- composer.json | 11 ++-- src/functions.php | 146 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 114 insertions(+), 43 deletions(-) diff --git a/composer.json b/composer.json index 9e24be2..5108945 100644 --- a/composer.json +++ b/composer.json @@ -4,12 +4,11 @@ "minimum-stability": "dev", "prefer-stable": true, "require":{ - "prooph/pdo-event-store":"^1.5.1", - "prooph/arangodb-event-store":"dev-master", - "prooph/arangodb-php-driver-polyfill":"dev-master", - "psr/container":"^1.0", - "zendframework/zend-servicemanager":"^3.3", - "vlucas/phpdotenv": "^2.4" + "prooph/pdo-event-store":"^1.10", + "prooph/arangodb-event-store":"^0.2.0", + "vlucas/phpdotenv": "^2.4", + "laminas/laminas-diactoros": "^2.3.0", + "filp/whoops": "^2.7" }, "require-dev":{ "malukenho/docheader": "^0.1.4", diff --git a/src/functions.php b/src/functions.php index f996cf3..8343bc2 100644 --- a/src/functions.php +++ b/src/functions.php @@ -4,12 +4,22 @@ namespace Prooph\EventStoreBenchmarks; -use ArangoDb\Connection; +use ArangoDb\Handler\Statement; +use ArangoDb\Http\Client; +use ArangoDb\Http\ClientOptions; +use ArangoDb\Http\TransactionalClient; +use ArangoDb\Http\TypeSupport; +use ArangoDb\Statement\ArrayStreamHandlerFactory; +use ArangoDb\Statement\StreamHandlerFactoryInterface; +use ArangoDb\Type\Batch; +use ArangoDb\Type\Database; +use Laminas\Diactoros\Request; +use Laminas\Diactoros\Response; +use Laminas\Diactoros\StreamFactory; use PDO; use Prooph\Common\Messaging\FQCNMessageFactory; -use Prooph\EventStore\ArangoDb\EventStore as ArangoDbEventStore; +use Prooph\EventStore\ArangoDb\ArangoDbTransactionalEventStore as ArangoDbEventStore; use Prooph\EventStore\ArangoDb\Projection\ProjectionManager as ArangoDbProjectionManager; -use Prooph\EventStore\ArangoDb\Type\DeleteCollection; use Prooph\EventStore\EventStore; use Prooph\EventStore\Pdo\MariaDbEventStore; use Prooph\EventStore\Pdo\MySqlEventStore; @@ -21,9 +31,17 @@ use Prooph\EventStore\StreamName; use Prooph\EventStore\Util\Assertion; use ProophTest\EventStore\Mock\TestDomainEvent; -use function Prooph\EventStore\ArangoDb\Fn\eventStreamsBatch; -use function Prooph\EventStore\ArangoDb\Fn\execute; -use function Prooph\EventStore\ArangoDb\Fn\projectionsBatch; +use Psr\Http\Message\RequestFactoryInterface; +use Psr\Http\Message\RequestInterface; +use Psr\Http\Message\ResponseFactoryInterface; +use Psr\Http\Message\ResponseInterface; +use Psr\Http\Message\StreamFactoryInterface; +use function Prooph\EventStore\ArangoDb\Func\eventStreamsBatch; +use function Prooph\EventStore\ArangoDb\Func\projectionsBatch; + +$whoops = new \Whoops\Run; +$whoops->pushHandler(new \Whoops\Handler\PlainTextHandler()); +$whoops->register(); function testDatabases(): array { @@ -106,14 +124,10 @@ function createConnection(string $driver) return new PDO("pgsql:host=$host;port=$port;dbname=$dbName;options='--client_encoding=\"$charset\"'", $username, $password); case 'arangodb': - $connection = new Connection( - [ - Connection::HOST => \getenv('ARANGODB_HOST'), - Connection::MAX_CHUNK_SIZE => 64, - Connection::VST_VERSION => Connection::VST_VERSION_11, - ] + $connection = new TransactionalClient( + getArangoDbHttpClient(), + getResponseFactory() ); - $connection->connect(); return $connection; } @@ -135,21 +149,20 @@ function createDatabase($connection, string $driver, string $dbName): void break; case 'arangodb': - $result = $connection->get('/_api/collection?excludeSystem=1'); + // need own client to create database + $client = getArangoDbHttpClient(true); + $response = $client->sendType(Database::create($dbName)); - $collections = \json_decode($result->getBody(), true); - - if (\count($collections['result']) > 1) { - execute($connection, - null, - ...\array_map(function ($col) { - return DeleteCollection::with($col['name']); - }, $collections['result']) - ); + if ($response->getStatusCode() !== 201) { + throw new \RuntimeException('Database could not be created'); } - - execute($connection, null, ...eventStreamsBatch()); - execute($connection, null, ...projectionsBatch()); + $connection->sendType( + Batch::fromTypes(...eventStreamsBatch()) + ); + $connection->sendType( + Batch::fromTypes(...projectionsBatch()) + ); + sleep(10); break; default: throw new \RuntimeException(\sprintf('Driver "%s" not supported', $driver)); @@ -175,17 +188,13 @@ function destroyDatabase($connection, string $driver, string $dbName): void $connection->exec('DROP TABLE projections;'); break; case 'arangodb': - $result = $connection->get('/_api/collection?excludeSystem=1'); + $type = 'application/' . (\getenv('USE_VPACK') === 'true' ? 'x-velocypack' : 'json'); + // need own client to create database + $client = getArangoDbHttpClient(true); + $response = $client->sendType(Database::delete($dbName)); - $collections = \json_decode($result->getBody(), true); - - if (\count($collections['result']) > 1) { - execute($connection, - null, - ...\array_map(function ($col) { - return DeleteCollection::with($col['name']); - }, $collections['result']) - ); + if ($response->getStatusCode() !== 200) { + throw new \RuntimeException('Database could not be created'); } break; default: @@ -218,6 +227,7 @@ function createEventStore(string $driver, $connection): EventStore return new ArangoDbEventStore( new FQCNMessageFactory(), $connection, + new Statement(getArangoDbHttpClient(), getStreamHandlerFactory()), createStreamStrategy($driver) ); } @@ -244,7 +254,8 @@ function createProjectionManager(EventStore $eventStore, string $driver, $connec case 'arangodb': return new ArangoDbProjectionManager( $eventStore, - $connection + $connection, + new Statement($connection, getStreamHandlerFactory()) ); } } @@ -328,3 +339,64 @@ function outputText(string $text, bool $useDate = true, string $lineEnding = PHP echo $text . $lineEnding; } } + +function getArangoDbHttpClient($useSystemDatabase = false): TypeSupport +{ + $options = [ + ClientOptions::OPTION_ENDPOINT => getenv('ARANGODB_HOST'), + ClientOptions::OPTION_RECONNECT => true, + ]; + + if ($useSystemDatabase === false) { + $options[ClientOptions::OPTION_DATABASE] = getenv('ARANGODB_DB'); + } + + return new Client( + $options, + getRequestFactory(), + getResponseFactory(), + getStreamFactory() + ); +} + +function getResponseFactory(): ResponseFactoryInterface +{ + return new class implements ResponseFactoryInterface + { + public function createResponse(int $code = 200, string $reasonPhrase = ''): ResponseInterface + { + $response = new Response(); + + if ($reasonPhrase !== '') { + return $response->withStatus($code, $reasonPhrase); + } + + return $response->withStatus($code); + } + }; +} + +function getRequestFactory(): RequestFactoryInterface +{ + return new class implements RequestFactoryInterface + { + public function createRequest(string $method, $uri): RequestInterface + { + $type = 'application/json'; + + $request = new Request($uri, $method); + $request = $request->withAddedHeader('Content-Type', $type); + return $request->withAddedHeader('Accept', $type); + } + }; +} + +function getStreamFactory(): StreamFactoryInterface +{ + return new StreamFactory(); +} + +function getStreamHandlerFactory(): StreamHandlerFactoryInterface +{ + return new ArrayStreamHandlerFactory(); +} From 451ce71480ff50e477af80a0262b8fcac213c6c7 Mon Sep 17 00:00:00 2001 From: Sandro Keil Date: Tue, 14 Jul 2020 17:18:17 +0200 Subject: [PATCH 04/12] Use some projection options --- src/AllProjector.php | 12 +++++++++++- src/CategoryProjector.php | 12 +++++++++++- src/StreamCreator.php | 1 + src/benchmark.php | 23 ++++++++++++++++++++--- 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/AllProjector.php b/src/AllProjector.php index 2b98fa6..9c08279 100644 --- a/src/AllProjector.php +++ b/src/AllProjector.php @@ -5,6 +5,7 @@ namespace Prooph\EventStoreBenchmarks; use Prooph\Common\Messaging\Message; +use Prooph\EventStore\Pdo\Projection\PdoEventStoreProjector; use Prooph\EventStore\Util\Assertion; class AllProjector @@ -33,7 +34,15 @@ public function run() $start = \microtime(true); - $projection = $projectionManager->createProjection('all_projection'); + $projection = $projectionManager->createProjection( + 'all_projection', + [ + PdoEventStoreProjector::OPTION_PERSIST_BLOCK_SIZE => 50, + PdoEventStoreProjector::OPTION_CACHE_SIZE => 50, + PdoEventStoreProjector::OPTION_SLEEP => 10000, + PdoEventStoreProjector::OPTION_PCNTL_DISPATCH => true, + ] + ); $projection ->init(function (): array { return ['count' => 0]; @@ -63,6 +72,7 @@ public function run() outputText(" ok\n", false); } catch (\Throwable $e) { echo $e->getMessage() . PHP_EOL . $e->getTraceAsString(); + throw $e; } } } diff --git a/src/CategoryProjector.php b/src/CategoryProjector.php index 39f5d8e..a9b589d 100644 --- a/src/CategoryProjector.php +++ b/src/CategoryProjector.php @@ -5,6 +5,7 @@ namespace Prooph\EventStoreBenchmarks; use Prooph\Common\Messaging\Message; +use Prooph\EventStore\Pdo\Projection\PdoEventStoreProjector; use Prooph\EventStore\Util\Assertion; use Ramsey\Uuid\Uuid; @@ -37,7 +38,15 @@ public function run() $start = \microtime(true); $uuid = Uuid::uuid4()->toString(); - $projection = $projectionManager->createProjection('category_projection_' . $uuid); + $projection = $projectionManager->createProjection( + 'category_projection_' . $uuid, + [ + PdoEventStoreProjector::OPTION_PERSIST_BLOCK_SIZE => 50, + PdoEventStoreProjector::OPTION_CACHE_SIZE => 50, + PdoEventStoreProjector::OPTION_SLEEP => 10000, + PdoEventStoreProjector::OPTION_PCNTL_DISPATCH => true, + ] + ); $projection ->init(function (): array { return ['count' => 0]; @@ -67,6 +76,7 @@ public function run() outputText(" ok\n", false); } catch (\Throwable $e) { echo $e->getMessage() . PHP_EOL . $e->getTraceAsString(); + throw $e; } } } diff --git a/src/StreamCreator.php b/src/StreamCreator.php index f5daca0..d1fd0a7 100644 --- a/src/StreamCreator.php +++ b/src/StreamCreator.php @@ -71,6 +71,7 @@ public function run() outputText(" ok\n", false); } catch (\Throwable $e) { echo $e->getMessage() . PHP_EOL . $e->getTraceAsString(); + throw $e; } } } diff --git a/src/benchmark.php b/src/benchmark.php index 433b539..23d8dd3 100644 --- a/src/benchmark.php +++ b/src/benchmark.php @@ -7,6 +7,7 @@ use Dotenv\Dotenv; use Prooph\Common\Messaging\Message; use Prooph\EventStore\EventStore; +use Prooph\EventStore\Pdo\Projection\PdoEventStoreProjector; use Prooph\EventStore\Projection\ProjectionManager; use Prooph\EventStore\Stream; use Prooph\EventStore\StreamName; @@ -143,7 +144,7 @@ $eventsPerSecond = 2500 / $time; outputText("test 3 using $name took $time seconds"); - outputText("test 3 using $name writes $eventsPerSecond events per second\n"); + outputText("test 3 using $name writes $eventsPerSecond events per second"); outputText('test 3 checking integrity ...', true, ''); checkWriteIntegrity($eventStore, $numberStreams[$name], $numberEvents[$name]); outputText(" ok\n", false); @@ -178,7 +179,15 @@ foreach ($projectionManagers as $name => $projectionManager) { /* @var ProjectionManager $projectionManager */ - $projection = $projectionManager->createProjection('test_projection_5'); + $projection = $projectionManager->createProjection( + 'test_projection_5', + [ + PdoEventStoreProjector::OPTION_PERSIST_BLOCK_SIZE => 50, + PdoEventStoreProjector::OPTION_CACHE_SIZE => 50, + PdoEventStoreProjector::OPTION_SLEEP => 10000, + PdoEventStoreProjector::OPTION_PCNTL_DISPATCH => true, + ] + ); $projection ->init(function (): array { return ['count' => 0]; @@ -213,7 +222,15 @@ foreach ($streamNamesTest1[$name] as $streamName) { $streamNames[] = $streamName->toString(); } - $projection = $projectionManager->createProjection('test_projection_6'); + $projection = $projectionManager->createProjection( + 'test_projection_6', + [ + PdoEventStoreProjector::OPTION_PERSIST_BLOCK_SIZE => 50, + PdoEventStoreProjector::OPTION_CACHE_SIZE => 50, + PdoEventStoreProjector::OPTION_SLEEP => 10000, + PdoEventStoreProjector::OPTION_PCNTL_DISPATCH => true, + ] + ); $projection ->init(function (): array { return ['count' => 0]; From bb69663e6ee267102b5bc0bf2bfa07fedf46c1bb Mon Sep 17 00:00:00 2001 From: Sandro Keil Date: Tue, 14 Jul 2020 17:22:59 +0200 Subject: [PATCH 05/12] Fix wrong log file --- bench.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bench.sh b/bench.sh index dacf3df..956a1a2 100755 --- a/bench.sh +++ b/bench.sh @@ -66,7 +66,7 @@ done for type in user post todo blog comment all do - php src/projector.php projectors${type} ${type} | tee logs/writer${WRITER_COUNTER}${type}.log & + php src/projector.php projectors${type} ${type} | tee logs/projector${type}.log & done echo "Waiting ... stay patient!" From 5e4334706872a8cc7e8f0dd327cc83d3e7032070 Mon Sep 17 00:00:00 2001 From: Sandro Keil Date: Tue, 14 Jul 2020 17:30:30 +0200 Subject: [PATCH 06/12] Update dependency prooph/arangodb-event-store to 0.2.1 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 5108945..2e27931 100644 --- a/composer.json +++ b/composer.json @@ -5,7 +5,7 @@ "prefer-stable": true, "require":{ "prooph/pdo-event-store":"^1.10", - "prooph/arangodb-event-store":"^0.2.0", + "prooph/arangodb-event-store":"^0.2.1", "vlucas/phpdotenv": "^2.4", "laminas/laminas-diactoros": "^2.3.0", "filp/whoops": "^2.7" From 950d66a78697cb875bc8e16369bb01b2b7249994 Mon Sep 17 00:00:00 2001 From: Sandro Keil Date: Tue, 14 Jul 2020 22:44:23 +0200 Subject: [PATCH 07/12] Remove cat of logs --- bench.sh | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/bench.sh b/bench.sh index 956a1a2..a9bd6c7 100755 --- a/bench.sh +++ b/bench.sh @@ -74,16 +74,6 @@ wait end=$(adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%07d", $2) }') -WRITER_COUNTER=0 -while [ ${WRITER_COUNTER} -lt ${WRITER_ITERATIONS} ]; do - for type in user post todo blog comment - do - cat logs/writer${WRITER_COUNTER}${type}.log - done - - WRITER_COUNTER=$((WRITER_COUNTER + 1)) -done - echo "" duration=$((end - start)) duration=$(printf ${duration} | awk '{ printf("%.08f\n", $1/1000000000.0) }' ) From 04db0676940340d198ff22a42d1f1e677df869e3 Mon Sep 17 00:00:00 2001 From: Sandro Keil Date: Tue, 14 Jul 2020 22:45:08 +0200 Subject: [PATCH 08/12] Use latest database Docker images --- docker-compose-mariadb.yml | 2 +- docker-compose-mysql.yml | 7 +++---- docker-compose-postgres.yml | 2 +- env/mysql/my.cnf | 10 ++++++---- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/docker-compose-mariadb.yml b/docker-compose-mariadb.yml index 7b979a7..5395adb 100644 --- a/docker-compose-mariadb.yml +++ b/docker-compose-mariadb.yml @@ -19,7 +19,7 @@ services: #mem_reservation: phpmem_reservation database: - image: mariadb:10.4.1 + image: mariadb:10.5.4 ports: - 3306 environment: diff --git a/docker-compose-mysql.yml b/docker-compose-mysql.yml index 13b98be..17986c7 100644 --- a/docker-compose-mysql.yml +++ b/docker-compose-mysql.yml @@ -19,10 +19,9 @@ services: #mem_reservation: phpmem_reservation database: - # mysql 8.0 not working properly - # see https://github.com/docker-library/mysql/issues/303 - #image: mysql:8.0.13 - image: mysql:5.7.24 + image: mysql:8.0.21 + cap_add: + - SYS_NICE ports: - 3306 environment: diff --git a/docker-compose-postgres.yml b/docker-compose-postgres.yml index 8813f91..4a8562b 100644 --- a/docker-compose-postgres.yml +++ b/docker-compose-postgres.yml @@ -19,7 +19,7 @@ services: #mem_reservation: phpmem_reservation database: - image: postgres:9.6 + image: postgres:12.3-alpine ports: - 5432:5432 environment: diff --git a/env/mysql/my.cnf b/env/mysql/my.cnf index 1ee0266..5ac9bf0 100644 --- a/env/mysql/my.cnf +++ b/env/mysql/my.cnf @@ -18,10 +18,12 @@ max_heap_table_size = 64M # * Query Cache Configuration # # Cache only tiny result sets, so we can fit more in the query cache. -query_cache_limit = 128K -query_cache_size = 128M -query_cache_min_res_unit=2k -query_cache_type=1 + +# not available for mysql 8.0.21 +# query_cache_limit = 128K +# query_cache_size = 128M +# query_cache_min_res_unit=2k +# query_cache_type=1 # * InnoDB # From 7825504561c072d1031b7710ec4abdfe0c1e930a Mon Sep 17 00:00:00 2001 From: Sandro Keil Date: Wed, 15 Jul 2020 22:07:18 +0200 Subject: [PATCH 09/12] Use uptime for time measurement - With `adjtimex` there are sometimes negative values --- bench.sh | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/bench.sh b/bench.sh index a9bd6c7..bfa3be5 100755 --- a/bench.sh +++ b/bench.sh @@ -40,6 +40,7 @@ export DRIVER=${DRIVER} export STREAM_STRATEGY=${STRATEGY} echo "" +php -v echo "Starting benchmark ${DRIVER}!" php src/prepare.php php src/benchmark.php @@ -54,7 +55,8 @@ php src/prepare.php WRITER_COUNTER=0 WRITER_ITERATIONS=10 -start=$(adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%07d", $2) }') +read up rest Date: Wed, 15 Jul 2020 22:07:42 +0200 Subject: [PATCH 10/12] Fix Single stream benchmark --- src/StreamCreator.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/StreamCreator.php b/src/StreamCreator.php index d1fd0a7..b10b05a 100644 --- a/src/StreamCreator.php +++ b/src/StreamCreator.php @@ -41,16 +41,24 @@ public function run() $start = \microtime(true); + $streamName = new StreamName($this->category . '-' . $this->id); + for ($i = 0; $i < $this->executions; $i++) { $count += $this->numberOfEvents; - $streamName = $this->category . '-' . Uuid::uuid4()->toString(); $events = createTestEvents(testPayload(), $this->numberOfEvents); if ($eventStore instanceof TransactionalEventStore) { $eventStore->beginTransaction(); } - $eventStore->create(new Stream(new StreamName($streamName), \SplFixedArray::fromArray($events))); + if (getenv('STREAM_STRATEGY') === 'Aggregate') { + $streamName = $this->category . '-' . Uuid::uuid4()->toString(); + $eventStore->create(new Stream(new StreamName($streamName), \SplFixedArray::fromArray($events))); + } elseif ($i === 0 && $eventStore->hasStream($streamName) === false) { + $eventStore->create(new Stream($streamName, \SplFixedArray::fromArray($events))); + } else { + $eventStore->appendTo($streamName, \SplFixedArray::fromArray($events)); + } if ($eventStore instanceof TransactionalEventStore) { $eventStore->commit(); From 0be21e348ec57e6aed920b5acae406661d7a8dbd Mon Sep 17 00:00:00 2001 From: Sandro Keil Date: Sun, 26 Jul 2020 21:41:13 +0200 Subject: [PATCH 11/12] Add used memory to output --- src/AllProjector.php | 2 +- src/CategoryProjector.php | 2 +- src/StreamCreator.php | 2 +- src/benchmark.php | 1 + src/functions.php | 8 ++++++++ 5 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/AllProjector.php b/src/AllProjector.php index 9c08279..ad471bf 100644 --- a/src/AllProjector.php +++ b/src/AllProjector.php @@ -66,7 +66,7 @@ public function run() $avg = $this->stopAt / $time; outputText("Projection $this->id read $readEvents events"); - outputText("Projection $this->id used $time seconds, avg $avg events/second"); + outputText("Projection $this->id used $time seconds, avg $avg events/second " . getMemoryConsumption()); outputText("Projection $this->id checking integrity ...", true, ''); Assertion::eq($readEvents, $stopAt, 'Number of all projected events invalid: Value "%s" does not equal expected value "%s".'); outputText(" ok\n", false); diff --git a/src/CategoryProjector.php b/src/CategoryProjector.php index a9b589d..379df2c 100644 --- a/src/CategoryProjector.php +++ b/src/CategoryProjector.php @@ -70,7 +70,7 @@ public function run() $avg = $this->stopAt / $time; outputText("Projection $this->id read $readEvents events"); - outputText("Projection $this->id used $time seconds, avg $avg events/second"); + outputText("Projection $this->id used $time seconds, avg $avg events/second " . getMemoryConsumption()); outputText("Projection $this->id checking integrity ...", true, ''); Assertion::eq($readEvents, 2500, 'Number of category projected events invalid: Value "%s" does not equal expected value "%s".'); outputText(" ok\n", false); diff --git a/src/StreamCreator.php b/src/StreamCreator.php index b10b05a..eec9d7b 100644 --- a/src/StreamCreator.php +++ b/src/StreamCreator.php @@ -73,7 +73,7 @@ public function run() $avg = ($this->executions * $this->numberOfEvents) / $time; outputText("Writer $this->id-$this->category wrote $this->eventsWritten events"); - outputText("Writer $this->id-$this->category used $time seconds, avg $avg events/second"); + outputText("Writer $this->id-$this->category used $time seconds, avg $avg events/second " . getMemoryConsumption()); outputText("Writer $this->id checking integrity ...", true, ''); Assertion::eq($count, $this->numberOfEvents * $this->executions, 'Number of writer events invalid: Value "%s" does not equal expected value "%s".'); outputText(" ok\n", false); diff --git a/src/benchmark.php b/src/benchmark.php index 23d8dd3..0096075 100644 --- a/src/benchmark.php +++ b/src/benchmark.php @@ -252,4 +252,5 @@ outputText('test 6 checking integrity ...', true, ''); Assertion::eq($projection->getState()['count'], 1000, 'Number of projected events invalid: Value "%s" does not equal expected value "%s".'); outputText(" ok\n", false); + outputText( "Mem usage/peak: " . getMemoryConsumption() . PHP_EOL, false); } diff --git a/src/functions.php b/src/functions.php index 8343bc2..1e18dd2 100644 --- a/src/functions.php +++ b/src/functions.php @@ -400,3 +400,11 @@ function getStreamHandlerFactory(): StreamHandlerFactoryInterface { return new ArrayStreamHandlerFactory(); } + +function getMemoryConsumption(): string +{ + $memUsage = memory_get_usage(); + $memPeak = memory_get_peak_usage(); + + return '(' . round($memUsage / 1024 / 1024, 2) . 'MB / ' . round($memPeak / 1024 / 1024, 2) . ' MB)'; +} From 157e3c01389b719330f486116b4477cd7557b264 Mon Sep 17 00:00:00 2001 From: Sandro Keil Date: Thu, 30 Jul 2020 14:20:34 +0200 Subject: [PATCH 12/12] Fix while loop definition --- bench.sh | 3 ++- bench_docker.sh | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/bench.sh b/bench.sh index bfa3be5..a9dfca1 100755 --- a/bench.sh +++ b/bench.sh @@ -5,7 +5,7 @@ USAGE="Usage: bench.sh --driver [arangodb | postgres | mysql | mariadb] [--strat DRIVER= STREAM_STRATEGY= -while [[ ${1} ]]; do +while [ ${1} ]; do case "${1}" in --driver) DRIVER=${2} @@ -41,6 +41,7 @@ export STREAM_STRATEGY=${STRATEGY} echo "" php -v + echo "Starting benchmark ${DRIVER}!" php src/prepare.php php src/benchmark.php diff --git a/bench_docker.sh b/bench_docker.sh index 3a36f26..175dde2 100755 --- a/bench_docker.sh +++ b/bench_docker.sh @@ -4,9 +4,9 @@ USAGE="Usage: bench_docker.sh --driver [arangodb | postgres | mysql | mariadb] [ IDLE_TIME=40 DRIVER= -STREAM_STRATEGY= +STRATEGY= -while [[ ${1} ]]; do +while [ ${1} ]; do case "${1}" in --driver) DRIVER=${2}