From f6a376d77a7254ae1c5b2f66a9b342da04b04310 Mon Sep 17 00:00:00 2001 From: odidev Date: Wed, 6 Aug 2025 09:22:44 +0000 Subject: [PATCH] Deploy MongoDB on Google Axion C4A virtual machine Signed-off-by: odidev --- .../mongodb-on-gcp/_index.md | 57 +++++ .../mongodb-on-gcp/_next-steps.md | 8 + .../mongodb-on-gcp/background.md | 22 ++ .../mongodb-on-gcp/baseline-testing.md | 212 ++++++++++++++++++ .../mongodb-on-gcp/benchmarking.md | 124 ++++++++++ .../mongodb-on-gcp/create-instance.md | 29 +++ .../mongodb-on-gcp/image1.png | Bin 0 -> 58872 bytes .../mongodb-on-gcp/mongodb-deploy.md | 119 ++++++++++ 8 files changed, 571 insertions(+) create mode 100644 content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/_index.md create mode 100644 content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/_next-steps.md create mode 100644 content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/background.md create mode 100644 content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/baseline-testing.md create mode 100644 content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/benchmarking.md create mode 100644 content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/create-instance.md create mode 100644 content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/image1.png create mode 100644 content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/mongodb-deploy.md diff --git a/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/_index.md b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/_index.md new file mode 100644 index 0000000000..37e306524b --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/_index.md @@ -0,0 +1,57 @@ +--- +title: Deploy MongoDB on Google Axion C4A virtual machine + +minutes_to_complete: 60 + +who_is_this_for: This Learning Path is designed for software developers looking to migrate their MongoDB workloads from x86_64 to Arm-based platforms, specifically on Google Axion-based C4A virtual machines. + +learning_objectives: + - Provision an Arm virtual machine on the Google Cloud Platform using the C4A Google Axion instance family, and RHEL 9 as the base image. + - Install and run MongoDB on an Arm-based GCP C4A instances. + - Validate the functionality of MongoDB through baseline testing. + - Benchmark the MongoDB performance on Arm using Yahoo Cloud Serving Benchmark (YCSB). + +prerequisites: + - A [Google Cloud Platform (GCP)](https://cloud.google.com/free?utm_source=google&hl=en) account with billing enabled. + - Basic understanding of Linux command line. + - Familiarity with the [MongoDB architecture](https://www.mongodb.com/) and deployment practices on Arm64 platforms. + +author: Jason Andrews + +##### Tags +skilllevels: Advanced +subjects: Databases +cloud_service_providers: Google Cloud + +armips: + - Neoverse + +tools_software_languages: + - MongoDB + - YCSB + +operatingsystems: + - Linux + +# ================================================================================ +# FIXED, DO NOT MODIFY +# ================================================================================ +further_reading: + - resource: + title: MongoDB Manual + link: https://www.mongodb.com/docs/manual/ + type: documentation + - resource: + title: MongoDB Performance Tool + link: https://github.com/idealo/mongodb-performance-test#readme + type: documentation + - resource: + title: YCSB + link: https://github.com/brianfrankcooper/YCSB/wiki/ + type: documentation + + +weight: 1 # _index.md always has weight of 1 to order correctly +layout: "learningpathall" # All files under learning paths have this same wrapper +learning_path_main_page: "yes" # Indicates this should be surfaced when looking for related content. Only set for _index.md of learning path content. +--- diff --git a/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/_next-steps.md b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/_next-steps.md new file mode 100644 index 0000000000..c3db0de5a2 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/_next-steps.md @@ -0,0 +1,8 @@ +--- +# ================================================================================ +# FIXED, DO NOT MODIFY THIS FILE +# ================================================================================ +weight: 21 # Set to always be larger than the content in this path to be at the end of the navigation. +title: "Next Steps" # Always the same, html page title. +layout: "learningpathall" # All files under learning paths have this same wrapper for Hugo processing. +--- diff --git a/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/background.md b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/background.md new file mode 100644 index 0000000000..99947c23e8 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/background.md @@ -0,0 +1,22 @@ +--- +title: "About Google Axion C4A series and MongoDB" + +weight: 2 + +layout: "learningpathall" +--- + +## Google Axion C4A series + +The Google Axion C4A series is a family of Arm-based virtual machines built on Google’s custom Axion CPU, which is based on Arm Neoverse-V2 cores. Designed for high-performance and energy-efficient computing, these virtual machine offer strong performance ideal for modern cloud workloads such as CI/CD pipelines, microservices, media processing, and general-purpose applications. + +The C4A series provides a cost-effective alternative to x86 virtual machine while leveraging the scalability and performance benefits of the Arm architecture in Google Cloud. + +To learn more about Google Axion, refer to the blog [Introducing Google Axion Processors, our new Arm-based CPUs](https://cloud.google.com/blog/products/compute/introducing-googles-new-arm-based-cpu). + +## MongoDB +MongoDB is a popular open-source NoSQL database designed for high performance, scalability, and flexibility. + +It stores data in JSON-like BSON documents, making it ideal for modern applications that require dynamic, schema-less data structures. + +MongoDB is widely used for web, mobile, IoT, and real-time analytics workloads. Learn more from the [MongoDB official website](https://www.mongodb.com/) and its [official documentation](https://www.mongodb.com/docs/). diff --git a/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/baseline-testing.md b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/baseline-testing.md new file mode 100644 index 0000000000..842709484f --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/baseline-testing.md @@ -0,0 +1,212 @@ +--- +title: Baseline Testing +weight: 5 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + + +Since MongoDB is installed successfully on your GCP C4A Arm virtual machine, follow these steps to validate that the server is running and accepting local connections. + +## MongoDB Baseline Testing (Using **mongosh**) + +1. Connect to MongoDB + +Open a shell session to the local MongoDB instance: +```console +mongosh mongodb://127.0.0.1:27017 +``` + +2. Create a Test Database and Collection: + +```console +use baselineDB +db.createCollection("test") +``` +This creates a new database **baselineDB** and an empty collection named test. + +You should see an output similar to: + +```output +test> use baselineDB +... db.createCollection("test") +... +switched to db baselineDB +``` +3. Insert 10,000 Test Documents: + +```javascript +for (let i = 0; i < 10000; i++) { + db.test.insertOne({ + record: i, + status: "new", + timestamp: new Date() + }) +} +``` +This simulates basic write operations with timestamped records. +10,000 documents will be cretaed and inserted into the test collection of the currently selected database. +The record field would increment from 0 to 9999. The status is always "new". +The timestamp would capture the insertion time for each document using ***new Date()***. + +You should see an output similar to: + +```output +{ + acknowledged: true, + insertedId: ObjectId('6892dacfbd44e23df4750aa9') +} +``` + +4. Read (Query) a Subset of Documents: + +Fetch a few documents to verify read functionality. +```javascript +db.test.find({ status: "new" }).limit(5) +``` +This command is a simple read operation to verify that your data is inserted correctly. It queries the test collection in the current database, and only returns documents where the status is "new". ***limit(5)*** returns only the first 5 matching documents. + +You should see an output similar to: + +```output +[ + { + _id: ObjectId('6892dacbbd44e23df474e39a'), + record: 0, + status: 'new', + timestamp: ISODate('2025-08-06T04:32:11.090Z') + }, + { + _id: ObjectId('6892dacbbd44e23df474e39b'), + record: 1, + status: 'new', + timestamp: ISODate('2025-08-06T04:32:11.101Z') + }, + { + _id: ObjectId('6892dacbbd44e23df474e39c'), + record: 2, + status: 'new', + timestamp: ISODate('2025-08-06T04:32:11.103Z') + }, + { + _id: ObjectId('6892dacbbd44e23df474e39d'), + record: 3, + status: 'new', + timestamp: ISODate('2025-08-06T04:32:11.104Z') + }, + { + _id: ObjectId('6892dacbbd44e23df474e39e'), + record: 4, + status: 'new', + timestamp: ISODate('2025-08-06T04:32:11.106Z') + } +] +``` +5. Update a Document: + +Update a specific document's field to validate update capability. +```javascript +db.test.updateOne({ record: 100 }, { $set: { status: "processed" } }) +``` +Above command will find the first document where record is exactly 100, and updates that document by setting its status field to "processed". + +You should see an output similar to: + +```output +{ + acknowledged: true, + insertedId: null, + matchedCount: 1, + modifiedCount: 1, + upsertedCount: 0 +} +``` +6. View the Updated Document Before Deletion + +```console +db.test.findOne({ record: 100 }) +``` +This retrieves the document where record is 100, allowing you to verify that its status has been updated to "processed". + +You should see output similar to: + +```output +{ + _id: ObjectId('689490ddb7235c65ca74e3fe'), + record: 100, + status: 'processed', + timestamp: ISODate('2025-08-07T11:41:17.508Z') +} +``` + +7. Delete a Document: + +```javascript +db.test.deleteOne({ record: 100 }) +``` +This tells MongoDB to delete one document from the test collection, where record is exactly 100. + +You should see an output similar to: + +```output +{ acknowledged: true, deletedCount: 1 } +``` +Now, confirm the deletion: + +```console +db.test.findOne({ record: 100 }) +``` +The above command confirms that the document was successfully deleted. + +You should see an output similar to: +```output +null +``` + +8. Measure Execution Time (Optional): + +The below snippet measures how long it takes to insert documents for performance insight. +```javascript +var start = new Date() +for (let i = 0; i < 10000; i++) { + db.test.insertOne({ sample: i }) +} +print("Insert duration (ms):", new Date() - start) +``` +You should see an output similar to: + +```output +Insert duration (ms): 4427 +``` +9. Count Total Documents: + +Count total entries to confirm expected data volume. +```javascript +db.test.countDocuments() +``` +You should see an output similar to: + +```output +19999 +``` +The count **19999** reflects the total documents after inserting 10,000 initial records, adding 10,000 more (in point 8), and deleting one (record: 100). + +10. Clean Up (Optional): + +Deletes the **baselineDB** database and all its contents. +```javascript +db.dropDatabase() +``` +You should see an output similar to: + +```output +{ ok: 1, dropped: 'baselineDB' } +``` + +The above is a destructive command that completely deletes the current database you are connected to in mongosh. + +The above operations confirm that MongoDB is installed successfully and is functioning as expected on the GCP Arm64 environment. + +Using **mongosh**, you validated key database operations such as **insert**, **read**, **update**, **delete**, and **count**. +Now, your MongoDB instance is ready for further benchmarking and production use. diff --git a/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/benchmarking.md b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/benchmarking.md new file mode 100644 index 0000000000..2ddf4990c6 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/benchmarking.md @@ -0,0 +1,124 @@ +--- +title: MongoDB Benchmarking +weight: 6 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## MongoDB Benchmarking with YCSB (Yahoo! Cloud Serving Benchmark) + +**YCSB (Yahoo! Cloud Serving Benchmark)** is an open-source benchmarking tool for evaluating the performance of NoSQL databases under different workloads. It supports operations like read, write, update, and scan to simulate real-world usage patterns. + +### Install YCSB (Build from Source) + +```console +sudo dnf install -y git maven java-11-openjdk-devel +git clone https://github.com/brianfrankcooper/YCSB.git +cd YCSB +mvn -pl site.ycsb:mongodb-binding -am clean package +``` + +### Load Phase – Insert Initial Dataset + +This phase inserts documents into MongoDB to simulate a typical workload. + +```console +./bin/ycsb load mongodb -s \ + -P workloads/workloada \ + -p mongodb.url=mongodb://127.0.0.1:27017/ycsb +``` +The core purpose of this phase is to prepare the database with initial records (default: 1,000) for benchmarking. + +### Execute Benchmark Workload + +This phase performs actual read/write operations and reports performance metrics. +```console +./bin/ycsb run mongodb -s \ + -P workloads/workloada \ + -p mongodb.url=mongodb://127.0.0.1:27017/ycsb +``` +Workload A (from workloads/workloada) simulates a balanced read/write workload: + +- 50% reads +- 50% updates/writes + +This is designed to mimic many real-world systems where reads and writes are equally important (e.g., session stores, shopping carts, etc.). +The above command measures latency and throughput of mixed read/write operations. + + +You should see an output similar to: + +```output +Loading workload... +Starting test. +2025-08-06 06:05:50:378 0 sec: 0 operations; est completion in 0 second +mongo client connection created with mongodb://127.0.0.1:27017/ycsb +DBWrapper: report latency for each error is false and specific error codes to track for latency are: [] +2025-08-06 06:05:50:874 0 sec: 1000 operations; 1953.12 current ops/sec; [READ: Count=534, Max=8279, Min=156, Avg=312.96, 50=261, 90=436, 99=758, 99.9=8279, 99.99=8279] [CLEANUP: Count=1, Max=4139, Min=4136, Avg=4138, 50=4139, 90=4139, 99=4139, 99.9=4139, 99.99=4139] [UPDATE: Count=466, Max=26543, Min=186, Avg=384.45, 50=296, 90=444, 99=821, 99.9=26543, 99.99=26543] +[OVERALL], RunTime(ms), 512 +[OVERALL], Throughput(ops/sec), 1953.125 +[TOTAL_GCS_G1_Young_Generation], Count, 2 +[TOTAL_GC_TIME_G1_Young_Generation], Time(ms), 3 +[TOTAL_GC_TIME_%_G1_Young_Generation], Time(%), 0.5859375 +[TOTAL_GCS_G1_Old_Generation], Count, 0 +[TOTAL_GC_TIME_G1_Old_Generation], Time(ms), 0 +[TOTAL_GC_TIME_%_G1_Old_Generation], Time(%), 0.0 +[TOTAL_GCs], Count, 2 +[TOTAL_GC_TIME], Time(ms), 3 +[TOTAL_GC_TIME_%], Time(%), 0.5859375 +[READ], Operations, 534 +[READ], AverageLatency(us), 312.96067415730334 +[READ], MinLatency(us), 156 +[READ], MaxLatency(us), 8279 +[READ], 50thPercentileLatency(us), 261 +[READ], 95thPercentileLatency(us), 524 +[READ], 99thPercentileLatency(us), 758 +[READ], Return=OK, 534 +[CLEANUP], Operations, 1 +[CLEANUP], AverageLatency(us), 4138.0 +[CLEANUP], MinLatency(us), 4136 +[CLEANUP], MaxLatency(us), 4139 +[CLEANUP], 50thPercentileLatency(us), 4139 +[CLEANUP], 95thPercentileLatency(us), 4139 +[CLEANUP], 99thPercentileLatency(us), 4139 +[UPDATE], Operations, 466 +[UPDATE], AverageLatency(us), 384.4527896995708 +[UPDATE], MinLatency(us), 186 +[UPDATE], MaxLatency(us), 26543 +[UPDATE], 50thPercentileLatency(us), 296 +[UPDATE], 95thPercentileLatency(us), 498 +[UPDATE], 99thPercentileLatency(us), 821 +[UPDATE], Return=OK, 466 +``` + +### YCSB Operations & Latency Metrics + +- **Operations Count**: Total number of operations performed by YCSB for each type. +- **Average Latency (us**): The average time (in microseconds) it took to complete each operation type. +- **Min Latency (us)**: The fastest (minimum) time observed for any single operation of that type. +- **Max Latency (us)**: The slowest (maximum) time recorded for any single operation of that type. + +### Benchmark summary on x86_64: +The following benchmark results are collected on a c3-standard-4 (4 vCPU, 2 core, 16 GB Memory) x86_64 environment, running RHEL 9. + +| Operation | Count | Avg Latency (us) | Min Latency (us) | Max Latency (us) | 50th Percentile (us) | 95th Percentile (us) | 99th Percentile (us) | +|-----------|-------|------------------|------------------|------------------|-----------------------|----------------------|-----------------------| +| READ | 472 | 672.27 | 177 | 56703 | 514 | 903 | 1331 | +| UPDATE | 528 | 621.27 | 214 | 12855 | 554 | 971 | 1224 | +| CLEANUP | 1 | 4702 | 4700 | 4703 | 4703 | 4703 | 4703 | + +### Benchmark summary on Arm64: +The following benchmark results are collected on a c4a-standard-4 (4 vCPU, 16 GB Memory) Arm64 environment, running RHEL 9. + +| Operation | Count | Avg Latency (us) | Min Latency (us) | Max Latency (us) | 50th Percentile (us) | 95th Percentile (us) | 99th Percentile (us) | +|----------|------------------|------------------|------------------|------------------|----------------------|----------------------|----------------------| +| READ | 534 | 312.96 | 156 | 8279 | 261 | 524 | 758 | +| UPDATE | 466 | 384.45 | 186 | 26543 | 296 | 498 | 821 | +| CLEANUP | 1 | 4138 | 4136 | 4139 | 4139 | 4139 | 4139 | + +### **Highlights from GCP C4A Arm virtual machine** + +- Arm results show low **average latencies**, **READ** at **313 us** and **UPDATE** at **384 us**. +- **50th** to **99th percentile** latencies remain stable, indicating consistent performance. +- **Max latency** spikes (**8279 us READ**, **26543 us UPDAT**E) suggest rare outliers. diff --git a/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/create-instance.md b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/create-instance.md new file mode 100644 index 0000000000..3ca28709da --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/create-instance.md @@ -0,0 +1,29 @@ +--- +title: Create Google Axion C4A Arm virtual machine +weight: 3 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + +## Introduction + +This guide walks you through provisioning **Google Axion C4A Arm virtual machine** on GCP with the **c4a-standard-4 (4 vCPUs, 16 GB Memory)** machine type, using the **Google Cloud Console**. + +If you are new to Google Cloud, it is recommended to follow the [GCP Quickstart Guide to Create a virtual machine](https://cloud.google.com/compute/docs/instances/create-start-instance). + +For more details, kindly follow the Learning Path on [Getting Started with Google Cloud Platform](https://learn.arm.com/learning-paths/servers-and-cloud-computing/csp/google/). + +### Create an Arm-based Virtual Machine (C4A) + +To create a virtual machine based on the C4A Arm architecture: +1. Navigate to the [Google Cloud Console](https://console.cloud.google.com/). +2. Go to **Compute Engine > VM Instances** and click on **Create Instance**. +3. Under the **Machine Configuration**: + - Fill in basic details like **Instance Name**, **Region**, and **Zone**. + - Choose the **Series** as `C4A`. + - Select a machine type such as `c4a-standard-4`. +![Instance Screenshot](./image1.png) +4. Under the **OS and Storage**, click on **Change**, and select Arm64 based OS Image of your choice. For this Learning Path, we pick **Red Hat Enterprise Linux** as the Operating System with **Red Hat Enterprise Linux 9** as the Version. Make sure you pick the version of image for Arm. +5. Under **Networking**, enable **Allow HTTP traffic** to allow HTTP communications. +6. Click on **Create**, and the instance will launch. diff --git a/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/image1.png b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..2a65bdcde8f415dd4cd48a36d1e05a2081af1296 GIT binary patch literal 58872 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 literal 0 HcmV?d00001 diff --git a/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/mongodb-deploy.md b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/mongodb-deploy.md new file mode 100644 index 0000000000..0725049259 --- /dev/null +++ b/content/learning-paths/servers-and-cloud-computing/mongodb-on-gcp/mongodb-deploy.md @@ -0,0 +1,119 @@ +--- +title: Install MongoDB on Google Axion C4A virtual machine +weight: 4 + +### FIXED, DO NOT MODIFY +layout: learningpathall +--- + + +## Install MongoDB and mongosh on Google Axion C4A virtual machine + +Install MongoDB and mongosh on GCP RHEL 9 Arm64 by downloading the binaries, setting up environment paths, configuring data and log directories, and starting the server for local access and verification. + +1. Install System Dependencies + +Install required system packages to support MongoDB: +```console +sudo dnf install -y libcurl openssl tar wget curl +``` + +2. Download annd Extract MongoDB + +Fetch and unpack the MongoDB binaries for Arm64: +```console +wget https://fastdl.mongodb.org/linux/mongodb-linux-aarch64-rhel93-8.0.12.tgz +tar -xzf mongodb-linux-aarch64-rhel93-8.0.12.tgz +ls mongodb-linux-aarch64-rhel93-8.0.12/bin +``` + +3. Add MongoDB to System PATH + +Enable running mongod from any terminal session: +```console +echo 'export PATH=~/mongodb-linux-aarch64-rhel93-8.0.12/bin:$PATH' >> ~/.bashrc +source ~/.bashrc +``` + +4. Create a data Directory + +Set up the database data directory: +```console +mkdir -p ~/mongodb-data/db +``` + +5. Start MongoDB Server + +Start MongoDB in the **foreground** (without --fork) to view real-time output and ensure it starts correctly: +```console +~/mongodb-linux-aarch64-rhel93-8.0.12/bin/mongod --dbpath ~/mongodb-data/db +``` +Once confirmed it's working, you can start MongoDB in the **background** with logging: +```console +./mongodb-linux-aarch64-rhel93-8.0.12/bin/mongod --dbpath ~/mongodb-data/db --logpath ~/mongodb-data/mongod.log --fork +``` +{{% notice Note %}}Make sure the **~/mongodb-data/db** directory exists before starting.{{% /notice %}} + +6. Install mongosh + +**mongosh** is the MongoDB Shell used to interact with your MongoDB server. It provides a modern, user-friendly CLI for running queries and database operations. + +Download and install MongoDB’s command-line shell for Arm: +```console +wget https://github.com/mongodb-js/mongosh/releases/download/v2.5.6/mongodb-mongosh-2.5.6.aarch64.rpm +sudo dnf install -y ./mongodb-mongosh-2.5.6.aarch64.rpm +``` +### Verify Mongodb and mongosh Installation + +Check if MongoDb and mongosh is properly installed: +```console +mongod --version +mongosh --version +``` +You should see an output similar to: +```output +db version v8.0.12 +Build Info: { + "version": "8.0.12", + "gitVersion": "b60fc6875b5fb4b63cc0dbbd8dda0d6d6277921a", + "openSSLVersion": "OpenSSL 3.2.2 4 Jun 2024", + "modules": [], + "allocator": "tcmalloc-google", + "environment": { + "distmod": "rhel93", + "distarch": "aarch64", + "target_arch": "aarch64" + } +} +$ mongosh --version +2.5.6 +``` + +### Connect to MongoDB via mongosh + +Start interacting with MongoDB through its shell interface: +```console +mongosh mongodb://127.0.0.1:27017 +``` +You should see an output similar to: +```output +Current Mongosh Log ID: 6891ebb158db5b705d74e399 +Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.5.6 +Using MongoDB: 8.0.12 +Using Mongosh: 2.5.6 + +For mongosh info see: https://www.mongodb.com/docs/mongodb-shell/ + +------ + The server generated these startup warnings when booting + 2025-08-05T07:17:45.864+00:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted + 2025-08-05T07:17:45.864+00:00: Soft rlimits for open file descriptors too low + 2025-08-05T07:17:45.864+00:00: For customers running the current memory allocator, we suggest changing the contents of the following sysfsFile + 2025-08-05T07:17:45.864+00:00: We suggest setting the contents of sysfsFile to 0. + 2025-08-05T07:17:45.864+00:00: Your system has glibc support for rseq built in, which is not yet supported by tcmalloc-google and has critical performance implications. Please set the environment variable GLIBC_TUNABLES=glibc.pthread.rseq=0 +------ + +test> +``` + +MongoDB installation is complete. You can now proceed with the baseline testing.