Skip to content

Commit c5fd0c4

Browse files
nits
1 parent 0420859 commit c5fd0c4

7 files changed

Lines changed: 27 additions & 19 deletions

File tree

content/learning-paths/servers-and-cloud-computing/dotnet-migration-nopcommerce/2-environment-setup.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ layout: learningpathall
99

1010
## Set up a Microsoft Azure virtual machine powered by Cobalt 100
1111

12-
Set up an Arm Cobalt environment first, then keep your toolchain and runtime configuration stable across all test runs. This creates a reliable Arm baseline for migration and tuning work.
12+
Set up an Arm Azure environment first, then keep your toolchain and runtime configuration stable across all test runs. This creates a reliable Arm baseline for migration and tuning work.
1313

1414
Start with the [Azure Cobalt Learning Path](https://learn.arm.com/learning-paths/servers-and-cloud-computing/cobalt/) and complete VM provisioning.
1515

@@ -33,13 +33,14 @@ sudo apt-get install -y dotnet-sdk-9.0
3333

3434
The Docker group change applies to new login sessions. Sign out and sign back in before running Docker without `sudo`, or run `newgrp docker` in the current terminal before continuing.
3535

36-
Confirm architecture and tool versions before proceeding. On Azure Cobalt, the Linux machine architecture should be `aarch64`, and the .NET SDK should be a 9.0.x release.
36+
Confirm architecture and tool versions before proceeding:
3737

3838
```bash
3939
uname -m
4040
dotnet --version
4141
docker --version
4242
```
43+
On Azure Cobalt, the Linux machine architecture should be `aarch64`, and the .NET SDK should be a `9.0.x` release.
4344

4445
The output is similar to:
4546

@@ -55,7 +56,7 @@ If you're upgrading from an older .NET version before migrating to Cobalt, use [
5556

5657
nopCommerce defaults to SQL Server, but you'll use PostgreSQL for Arm validation. For PostgreSQL installs, you need `citext` before migration and installation. Without it, installer migrations fail with `type "citext" does not exist` (captured in local test artifacts).
5758

58-
Create PostgreSQL and enable `citext` before running the installer. The database runs in Docker on the Cobalt VM so the nopCommerce app can connect to `127.0.0.1:5432` during the local validation phase.
59+
Create PostgreSQL and enable `citext` before running the installer. The database runs in Docker on the VM so the nopCommerce app can connect to `127.0.0.1:5432` during the local validation phase.
5960

6061
Replace the password value before running the following commands:
6162

content/learning-paths/servers-and-cloud-computing/dotnet-migration-nopcommerce/3-checkout-build-baseline.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ git fetch --tags --prune
2626
git checkout release-4.90.3
2727
git rev-parse --short=10 HEAD # expect 9beda11c42
2828
```
29-
The later commands assume you're in the `nopCommerce` repository root unless stated otherwise.
29+
Later commands in the section assume you're in the `nopCommerce` repository root unless stated otherwise.
3030

3131
If you open a new terminal later, return to the same repository root before running commands:
3232

@@ -49,7 +49,9 @@ Restoring first separates package resolution problems from compilation problems,
4949

5050
### Start and install nopCommerce
5151

52-
Start the app locally and complete installer setup with PostgreSQL. Run the following command in one terminal and leave it running:
52+
Start the app locally and complete installer setup with PostgreSQL.
53+
54+
Run the following command in one terminal and leave it running:
5355

5456
```bash
5557
cd src/Presentation/Nop.Web
@@ -221,7 +223,7 @@ python3 test_nopcommerce_endpoints.py \
221223

222224
The command prints the per-route summary and writes the raw measurements to `arm_before.json`. Keep that JSON file unchanged because it's the baseline artifact used in the tuning step.
223225

224-
#### Baseline quality rules
226+
### Baseline quality rules
225227

226228
Use these rules before you compare any optimization result:
227229

content/learning-paths/servers-and-cloud-computing/dotnet-migration-nopcommerce/4-dependency-mapping-manifests.md

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,26 +13,31 @@ Run dependency discovery before migration changes so you understand direct refer
1313

1414
### Map direct references
1515

16-
Start from the `nopCommerce` repository root. Project-level references show what the app explicitly depends on before NuGet expands the graph. The command searches project files under `src` and prints file names and line numbers so you can jump directly to the owning project.
16+
Start from the `nopCommerce` repository root. Project-level references show what the app explicitly depends on before NuGet expands the graph.
17+
18+
Run the following command to search project files under `src` and print file names and line numbers, so you can jump directly to the owning project:
1719

1820
```bash
1921
rg -n "<PackageReference|<ProjectReference" src
2022
```
2123

2224
### List transitive dependencies
2325

24-
Enumerate the full dependency graph for the web entry point. Transitive packages often carry architecture-sensitive constraints, so review the output for runtime-specific package names, native library packages, image processing libraries, database providers, and platform-specific assets.
26+
Enumerate the full dependency graph for the web entry point:
2527

2628
```bash
2729
dotnet list src/Presentation/Nop.Web/Nop.Web.csproj package --include-transitive
2830
```
31+
Transitive packages often carry architecture-sensitive constraints. Review the output for runtime-specific package names, native library packages, image processing libraries, database providers, and platform-specific assets.
2932

3033
### Generate an SBOM
3134

3235
Generate an SBOM so you can track all components, versions, and exposure surface as a first-class migration artifact. While not strictly necessary for migration purposes, this is a best practice that'll save time. You can also give this SBOM to an LLM to extract insights about your codebase.
3336

3437
The CycloneDX tool is installed as a .NET global tool. Add `~/.dotnet/tools` to `PATH` in the current shell so the `dotnet-CycloneDX` command is available immediately after installation.
3538

39+
To generate an SBOM, run the following command:
40+
3641
```bash
3742
dotnet tool install --global CycloneDX
3843
export PATH="$PATH:$HOME/.dotnet/tools"
@@ -43,7 +48,7 @@ The `-rs` option includes project references, and `-F Json` writes JSON output t
4348

4449
### Inspect package internals for native payloads
4550

46-
Inspect package contents directly when a dependency looks architecture-sensitive. NuGet package folders are usually lower case on Linux, so set `PACKAGE_ID` to the folder name under `~/.nuget/packages` and `PACKAGE_VERSION` to the version you want to inspect.
51+
Inspect package contents directly when a dependency looks architecture-sensitive. NuGet package folders are usually lower case on Linux, so set `PACKAGE_ID` to the folder name under `~/.nuget/packages` and `PACKAGE_VERSION` to the version you want to inspect:
4752

4853
```bash
4954
PACKAGE_ID="replace-with-package-id"
@@ -72,4 +77,4 @@ You must resolve B first, then validate A, then validate the app.
7277

7378
You've reviewed application dependencies to understand what can change when you migrate to Arm.
7479

75-
Next, you'll explore options to containerize the application.
80+
Next, you'll explore options to containerize and migrate the application.

content/learning-paths/servers-and-cloud-computing/dotnet-migration-nopcommerce/5-containerization.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ layout: learningpathall
99

1010
## Containerize and migrate the application
1111

12-
Containerization should preserve reproducibility across architectures. The following are practical paths for Dockerfile-based builds and .NET SDK container publish, with guardrails for multi-architecture delivery.
12+
Containerization should preserve reproducibility across architectures. The following are practical paths for Dockerfile-based builds, and .NET SDK container publish with multi-architecture delivery guardrails.
1313

1414
Use the Dockerfile workflow as the default migration path for nopCommerce until your SDK-published image has the same Linux runtime dependencies and smoke-test results. Use SDK publish when you want MSBuild-owned image metadata and have a repeatable plan for the native packages that the Dockerfile previously installed.
1515

content/learning-paths/servers-and-cloud-computing/dotnet-migration-nopcommerce/6-deploy-verify-cobalt.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Start with a conservative runtime profile that's commonly effective for server w
1717

1818
Runtime environment variables are read when the .NET process starts. Stop the baseline `dotnet run` process, set the variables in the same terminal, and then restart nopCommerce.
1919

20-
The following thread-pool minimum matches the 2-vCPU validation VM. Treat it as a starting point, not a universal value for every Cobalt size:
20+
The following thread-pool minimum matches the 2-vCPU validation VM. Treat it as a starting point, not a universal value for every VM size:
2121

2222
```bash
2323
export DOTNET_TieredCompilation=1
@@ -36,7 +36,7 @@ cd ~/nopCommerce/src/Presentation/Nop.Web # replace with your clone path if dif
3636
dotnet run -c Release --no-build --urls http://0.0.0.0:5000
3737
```
3838

39-
Increase `DOTNET_ThreadPool_ForceMinWorkerThreads` only when traces or load-test data show thread-pool starvation. Keep `DOTNET_EnableDiagnostics=0` for final measurement runs only; remove it when you need `dotnet-trace`, `dotnet-counters`, or profiler-based evidence.
39+
Increase `DOTNET_ThreadPool_ForceMinWorkerThreads` only when traces or load-test data show thread-pool starvation. Keep `DOTNET_EnableDiagnostics=0` for final measurement runs only. Remove it when you need `dotnet-trace`, `dotnet-counters`, or profiler-based evidence.
4040

4141
#### (Optional) Run spin-wait experiment for .NET 8, 9, and 10
4242

@@ -56,7 +56,7 @@ Treat this as an experiment, not a default. Turning off spin waiting can reduce
5656
- `TieredPGO` favors steady-state throughput by letting the JIT recompile hot methods with runtime profile data.
5757
- Test them together and separately if startup latency and warmed throughput both matter.
5858

59-
Run the same endpoint suite used in the baseline from a second terminal. Keep the app running with the tuning profile in the first terminal, and run the tester from the repository root so the before and after JSON files sit next to each other.
59+
Run the same endpoint suite used in the baseline from a second terminal. Keep the app running with the tuning profile in the first terminal, and run the tester from the repository root so the before and after JSON files sit next to each other:
6060

6161
```bash
6262
cd ~/nopCommerce # replace with your clone path if different
@@ -80,7 +80,7 @@ jq '.summary' arm_after.json
8080

8181
Use these rules before adopting a tuning profile:
8282

83-
- Run at least 5 baseline and 5 tuned trials.
83+
- Run at least five baseline and five tuned trials.
8484
- Keep endpoint sequence fixed across all runs.
8585
- Reset warm-up policy consistently (always warm or always cold).
8686
- Require improvement in both throughput and p95 latency, not just one.

content/learning-paths/servers-and-cloud-computing/dotnet-migration-nopcommerce/7-arm-mcp-server.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ layout: learningpathall
99

1010
## Optimize with the Arm MCP Server
1111

12-
Use the Arm MCP Server after the manual baseline is complete. The agent should accelerate analysis and execution, but your benchmark artifacts remain the source of truth for what actually improved.
12+
Use the Arm MCP Server after the manual baseline is complete. The agent accelerates analysis and execution, but your benchmark artifacts remain the source of truth for what actually improved.
1313

1414
If you're new to this toolchain, see the [Arm MCP Server Learning Path](https://learn.arm.com/learning-paths/servers-and-cloud-computing/arm-mcp-server/) for setup and core usage patterns.
1515

@@ -25,7 +25,7 @@ Identify endpoints most likely to benefit from Arm tuning.
2525
Rank them by expected impact and explain why.
2626
```
2727

28-
The output includes the following:
28+
The output should include the following:
2929

3030
- Ranked endpoint list
3131
- Bottleneck hypotheses per endpoint

content/learning-paths/servers-and-cloud-computing/dotnet-migration-nopcommerce/_index.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ generated_summary_faq:
3939
Arm-based virtual machine powered by Azure Cobalt 100, create a reproducible baseline, and apply
4040
measured runtime tuning. First, you'll pin a specific nopCommerce release, verify a clean build,
4141
and capture an endpoint baseline on Arm to control for drift. By running dependency discovery and generating SBOM, you'll surface direct, transitive, and native payloads early to reduce surprises during
42-
deployment. You'll compare and choose a containerization path between a Dockerfile workflow and a .NET
43-
SDK publish with guardrails for multi-architecture delivery. Finally, you'll apply
42+
deployment. You'll compare and choose a containerization path between a Dockerfile workflow, and a .NET
43+
SDK publish with multi-architecture delivery guardrails. Finally, you'll apply
4444
architecture-conditional runtime settings and validate them against fixed workloads so you
4545
can keep or discard changes based on repeatable results.
4646
faqs:

0 commit comments

Comments
 (0)