top of page

86 results found with an empty search

  • Decoding SPECpower_ssj2008

    In the world of enterprise IT, raw computing performance used to be the only metric that mattered. If a server crashed through complex tasks, nobody cared how much electricity it burned or how hot the room got. That mindset shifted dramatically in December 2007 when the Standard Performance Evaluation Corporation (SPEC) released SPECpower_ssj2008, the first industry-standard benchmark designed to evaluate both performance and power consumption across varying workload levels. Here is a breakdown of what SPECpower_ssj2008 actually is, how world records are measured, and why tuning a system to beat it is a blend of precision science and extreme hardware optimization. What is SPECpower_ssj2008? The ssj stands for Server Side Java. The workload simulates a multi-tier, enterprise-level Java application (like an e-commerce backend handling transactions, database operations, and object allocations). It scales easily, multi-threads across CPU cores, and strains memory hierarchies and operating systems in ways that mimic real-world business loads. Instead of measuring energy at full throttle alone, SPECpower measures how efficient a server is across its entire operational curve. [ Controller Machine ] | +-----------+-----------+ | | (PTDaemon / CCS) (Load Director) | | v v [ Power Analyzer ] ---> [ System Under Test (SUT) ] ^ | [ Temp Sensor ] How SPECpower World Records Are Measured Setting a SPECpower world record isn't just about plugging a server into a wall and running a stress test; it requires a strict setup verified by strict measurement rules. 1. The Hardware & Software Triad To execute a valid SPECpower test, three separate components are involved: System Under Test (SUT): The server being evaluated. Control and Collection System (CCS) / Controller: A completely separate machine that coordinates the test, collects data, and issues commands. Power & Temperature Daemon (PTDaemon): Software running on the controller that talks directly to physical power meters and environmental sensors. 2. Physical Measurement Calibration World records live and die by strict measurement compliance: Power Analyzers: Power isn't measured in software; it is measured at the AC wall inlet using high-precision physical power analyzers (accepted brands include Yokogawa, ZES ZIMMER, and Chroma). Temperature Control: Ambient room temperature must be logged continuously. Cold air improves power delivery efficiency and lowers internal fan speeds, so thermal consistency is strictly mandated. 3. The Test Phases The SPECpower run follows a strict step-by-step procedure: [ Warm-up Phase ] ---> [ Calibration Phase ] ---> [ Graduated Load Phase ] (Stabilize Temps) (Find Max Throughput) (100% down to Active Idle) Warm-up: The server runs workloads to heat up components and stabilize power draw. Calibration: The system pushes to 100% capacity to determine its peak capacity, measured in ssj_ops (server-side Java operations per second). Graduated Loads (The Core Test): The test steps down from 100% workload to 10% in 10% decrements, finishing at Active Idle (0% workload). Each step runs for a fixed duration, capturing average operations per second and average watts consumed. The Score: How "Overall ssj_ops/watt" is Calculated The final metric used to rank servers and determine world records is overall ssj_ops/watt. Instead of taking a simple average of ratios, SPECpower uses a sum-based calculation: $$\text{Overall Score} = \frac{\sum_{i=10\%}^{100\%} \text{ssj\_ops}_i}{\sum_{i=0\%}^{100\%} \text{Watts}_i}$$ Key Nuance: Notice that the numerator (performance) sums the active load levels (10% to 100%), while the denominator (power) sums all 11 levels, including Active Idle. This design heavily penalizes servers that consume excessive power while idling. How can Whilone contribute? Whileone Techsoft Private Limited (based in Pune, India) is a specialized Performance Engineering, Workload Characterization, and Silicon/Cloud Benchmarking services firm. Founded by semiconductor industry veterans, their core business centers on CPU performance tuning, hardware characterization, and workload porting across x86, ARM, RISC-V, and custom silicon architectures. For an enterprise benchmark like SPECpower_ssj2008, Whileone Techsoft operates in the exact domain where record-breaking scores are achieved. Here is how a performance engineering company like Whileone Techsoft contributes to SPECpower_ssj2008 across the hardware and software lifecycle: 1. Workload Characterization & Microarchitecture Profiling Before a server can beat a world record, engineers must know where it loses efficiency. Hardware Telemetry: Whileone analyzes CPU counters (instructions per cycle, L1/L2/L3 cache misses, branch mispredictions, memory bus bandwidth) while the ssj2008 Java workload steps down from 100% to 10% load. Identifying Bottlenecks: They map execution states to see if the CPU spends too much power waiting on memory controllers or if inter-core communication overhead is dragging down efficiency. 2. Low-Level Firmware & OS Power State Tuning Setting SPECpower records requires deep silicon-level tweaking. Whileone's expertise in semiconductor and firmware validation directly applies here: C-State & P-State Optimization: Fine-tuning CPU frequency governors (intel_pstate, amd_pstate) and power-state transition latencies. The goal is to let idle cores drop to maximum power-saving sleep states instantly during low-load intervals without lagging when a new Java transaction arrives. Fan & Thermal Profiles: Developing customized BMC (Baseboard Management Controller) fan curves to keep internal power consumption to an absolute minimum while keeping silicon within safe operating temperatures. 3. Advanced JVM & Runtime Optimization Because ssj2008 is a Java workload, a significant portion of performance comes down to software runtime behavior. Whileone helps clients tune JVMs (HotSpot, OpenJDK, IBM Semeru) by: Garbage Collection (GC) Tuning: Configuring GC algorithms (ZGC, Shenandoah, G1) so garbage collection cycles do not spike power draw or drop transaction rates during critical 240-second measurement windows. JIT Compilation Optimization: Crafting JIT compiler flags so hot loops compile into highly optimized assembly instructions for specific CPU instruction sets (AVX-512, AMX, ARM SVE). 4. Multi-Architecture Validation (x86 vs. ARM vs. RISC-V) With hyper-scalers and chipmakers adopting ARM (Ampere, Neoverse, Graviton) and RISC-V alongside traditional x86 CPUs, benchmarking energy efficiency across architectures is critical. Whileone assists chip designers (SoC/ASIC developers), server OEMs, and cloud providers by: Porting and validating SPECpower runtimes across non-x86 hardware. Providing unbiased ssj_ops/watt comparisons across different architectural node shrinks and chiplet designs. 5. Automation Frameworks & Continuous Benchmarking Running SPECpower correctly takes ~70 minutes per iteration under strict thermal and measurement controls. Whileone develops custom, automated performance testing pipelines that: Integrate PTDaemon (power meter logging) and environmental temperature sensing into automated test rigs. Parse XML/CSV run logs automatically to highlight power regressions across BIOS, OS, or driver software updates.

  • AI assistant for Beaglebone using LLM

    Introduction For this project, I have used llama.cpp as the local inference engine and TinyLlama-1.1B-Chat-v1.0 as the language model. llama.cpp is a lightweight C/C++ inference framework designed to run LLMs locally with minimal setup across CPUs and GPUs. It is well suited for embedded and edge-oriented workflows because it supports efficient local execution without depending on cloud APIs. The TinyLlama model used here is the chat-tuned 1.1B parameter variant published on Hugging Face under the Apache 2.0 license. The model is available in GGUF format. GGUF is a new format introduced by the llama.cpp team and is a replacement for GGML, which is no longer supported by llama.cpp https://huggingface.co/TheBloke/TinyLlama-1.1B-Chat-v1.0-GGUF For controlled tool-planning and summarization tasks, we launch the model in non-conversation mode so that the model behaves like a constrained completion engine rather than an interactive chatbot. In the llama.cpp tooling, the completion-style path is intended for prompt-to-output generation, while the chat-oriented tools enable conversation behavior and chat templates. In my workflow, I use two prompt templates: A typical launch pattern looks like this: llama-cli.exe ^ -m .\tinyllama.gguf ^ -f .\planner_prompt.txt ^ -jf .\planner_schema.json ^ -n 160 ^ --temp 0.1 ^ --top-p 0.9 ^ --simple-io ^ -no-cnv ^ --no-display-prompt ^ --no-warmup Here, the important options are: -m to load the GGUF model -f to pass a prompt template from a file -jf to constrain output with a JSON schema -no-cnv to disable conversation mode --simple-io to make subprocess integration cleaner --no-warmup to reduce startup overhead during rapid testing - -temp 0.1 makes the model highly deterministic, choosing the most likely word almost every time (great for summarization) --top-p 0.9 is a sampling safeguard For summarization, the same pattern can be reused with a different template file: llama-cli.exe ^ -m .\tinyllama.gguf ^ -f .\summarizer_prompt.txt ^ -n 80 ^ --temp 0.1 ^ --top-p 0.9 ^ --simple-io ^ -no-cnv ^ --no-display-prompt ^ --no-warmup This approach works well because the model is not asked to “know everything” about the target device. Instead, it performs two narrower jobs: Study the user query and select the correct tools Summarize the evidence returned by those tools That makes the system much more reliable than allowing free-form generation. The Linux truth still comes from deterministic commands executed over SSH, while TinyLlama is used mainly for interpretation and orchestration. System Architecture Key Components 2.1 Llama Builder The builder uses an LLM to decide which diagnostic tools should run. Example prompt: User question: Is HDMI connected? Allowed tools: hdmi.status Planner output: { "tools": [ { "name": "hdmi.status", "args": {} } ], "confidence": 0.95 } The builder does not generate commands. It only selects from predefined tools. This prevents unsafe command execution. 2.2 Tool Registry Each diagnostic tool is defined in the engine. Example: hdmi.status Command executed on device: for f in /sys/class/drm/*HDMI*/status; do printf "%s: %s\n" "$f" "$(cat "$f")" done The registry maps the tool name to the command and output parser. 2.3 SSH Execution Engine The engine connects to the device using SSH. Instead of passing long shell commands through SSH arguments, the command is sent via standard input. Example: ssh debian@192.168.1.11 bash -s -- The command script is then streamed to the remote shell. This approach avoids complex quoting issues across: Windows SSH Bash 2.4 Parsing Raw Linux output is converted into structured data. Example raw output: /sys/class/drm/card0-HDMI-A-1/status: disconnected Parsed result: { "connected": false, "entries": [ { "path": "/sys/class/drm/card0-HDMI-A-1/status", "status": "disconnected" } ] } Structured evidence makes the results easier to analyze and summarize. 2.5 LLM Response Finally, the LLM converts evidence into a concise explanation. Example output: - HDMI is disconnected. - Checked DRM HDMI status from sysfs. - Connector /sys/class/drm/card0-HDMI-A-1/status reported disconnected. The response is constrained to use only the evidence and not invent information. Example Questions the System Can Answer 3.1 Display diagnostics Is HDMI connected ? 3.2 Sensor discovery Are any sensors detected ? 3.3 Performance analysis Is the system overloaded ? 3.4 Networking IP address of device ? 3.5 Service health Are any system services failing ? GUI Screenshots

  • Tuning for SPEC CPU 2017 Performance Optimization

    Industry-standard benchmarks play a critical role in evaluating and comparing server performance across different processor architectures, operating systems, and hardware platforms. Among these benchmarks, SPEC CPU 2017 is widely recognized for measuring compute-intensive performance using a diverse collection of integer and floating-point workloads that represent real-world applications such as artificial intelligence, simulation, image processing, and data analytics. As organizations are increasingly relying on benchmark data for infrastructure planning and procurement decisions, achieving competitive benchmark results has become an important objective for system manufacturers and technology providers. Achieving industry-leading benchmark performance requires more than powerful hardware. Significant gains can be realized through careful optimization of BIOS settings, operating system configuration, and kernel parameters. Our engineering teams have collaborated with system manufacturers and technology partners to optimize platforms for benchmark performance. These efforts have contributed to multiple top-ranking results across a variety of processor architectures and server platforms. This article summarizes common tuning methodologies and best practices that can help maximize SPEC CPU 2017 performance. Understanding the optimization stack SPEC CPU 2017 performance depends on several layers: Hardware architecture BIOS configuration OS tuning Kernel parameter optimization Compiler and runtime settings Although processor capabilities do form a foundation, platform tuning often comes into picture when a competitive or record-level performance is required. BIOS Tuning Best Practices Power Management Configuration Modern processors provide multiple power-saving features. For benchmark workloads, performance-oriented settings are typically preferred. Common considerations include: Performance power profiles Turbo/Boost technologies C-state management P-state management Autonomous frequency control Compute intensive benchmarks often benefit from aggressive frequency boosting. Think about 500.perlbench_r, which benefits from high single-thread frequency, or 502.gcc_r that is highly sensitive to processor frequency. NUMA Optimization NUMA configuration is particularly important on multi-socket systems. Commonly evaluated systems include: NUMA enable/disable NUMA grouping Node interleaving Virtual NUMAs Workloads with large memory footprints often benefit from maintaining memory locality. Like the 554.roms_r (FP) having large memory footprint and NUMAaware behavior. Memory configuration Memory subsystem tuning is one of the most important areas for benchmark optimization. Some areas commonly reviewed: Maximum supported memory frequency DIMM population strategy Memory interleaving Processor features Modern processors expose numerous performance-related controls. One of the frequently evaluated options is: Hyper-Threading. When configuring enterprise servers for the industry-standard SPEC CPU2017 benchmark, your Hyper-Threading (Intel) or SMT (AMD) BIOS setting is dictated entirely by your target metric. For SPECrate (throughput) submissions, you should always enable HT/SMT. This maximizes concurrent processing by creating two logical threads per core, filling idle CPU cycles to drive up overall workload volume. Conversely for SPECspeed(raw speed) submissions, you must disable HT/SMT. This eliminates resource contention and minimizes latency and accelerates single-task execution time. Operating System Tuning OS tuning plays a critical role in ensuring that processor and memory resources are utilized efficiently. During SPEC CPU2017 benchmarking activities, we have evaluated multiple enterprise Linux distributions, including Red Hat Enterprise Linux (RHEL), SUSE Linux Enterprise Server (SLES), and Ubuntu Server. Although the tuning objectives remain similar across distributions, each OS provides different mechanisms for performance optimization. The tuned framework allows administrators to apply predefined system profiles. Taking an example: tuned-adm profile throughput-performance. This setting explicitly changes the CPU scaling governor to performance mode, locking the CPU at its highest frequency and disabling dynamic power saving C-states. One of the most impactful operating system settings is the CPU frequency governor. Common governors include: performance - maintains maximum operating frequency powersave - prioritize power efficiency ondemand - dynamically adjusts frequency schedutil - Scheduler-driven frequency scaling For benchmark execution, the performance governor is commonly preferred because it minimizes frequency scaling latency and helps maintain consistent execution behaviour. Looking Ahead: SPEC CPU 2026 While SPEC CPU 2017 continues to serve as a widely adopted benchmark, the industry is steadily transitioning toward newer benchmark suites that better reflect modern computing workloads. In addition to our ongoing work with SPEC CPU 2017, our performance engineering teams are actively evaluating and optimizing platforms for SPEC CPU 2026. Leveraging our experience gained from system tuning, we are applying similar performance engineering methodologies to help customers maximize results on next-generation server platforms. Challenges Encountered During SPEC CPU 2017 Benchmarking Achieving top-tier SPEC CPU 2017 results involves significantly more than executing benchmark workloads on high-performance hardware. One of the primary challenges is identifying the optimal combination of BIOS settings and runtime settings on each platform. Multi socket systems introduce additional complexity through NUMA topology and memory locality. Another challenge is balancing aggressive performance tuning with the strict compliance and disclosure requirements of SPEC submissions, where every reported result must be reproducible and conform to benchmark rules. Despite these challenges, our performance engineering team has successfully optimized a wide range of server platforms across multiple processor generations and operating systems. Through a combination of BIOS optimization, OS tuning, workload characterization, and extensive validation, our organization has contributed to numerous industry-leading benchmark submissions. These efforts have resulted in multiple world-record and top-ranking SPEC CPU benchmark results published on the SPEC website for leading server manufacturers and enterprise customers. The experience gained from these engagements has helped establish a systematic methodology for maximizing performance.

  • Our Site Reliability Engineering Playbook: Chaos Engineering, SLOs, and Automated RCA

    Most engineering teams find out their system is broken when a customer tweets about it at 2 AM. We find out before the customer ever notices. And when something does go wrong, we know the root cause in under three minutes, not three hours. Here's what we actually do, and why it matters more than most people realize. Site Reliability Engineering Isn't Just Dashboards and On-Call Rotations There's a widespread misconception that Site Reliability Engineering is glorified sysadmin work, someone who watches graphs and gets paged when things go red. That's not SRE. That's firefighting. And firefighting at scale is just controlled chaos with a Slack channel. Real SRE is about building systems that degrade gracefully, recover automatically, and give you enough signal to understand why something failed before you're already underwater. Our SRE practice is built around a few core pillars: Real-time observability across the full request lifecycle. We instrument every service from API gateway to ML inference pods, and stream structured logs with severity classification (INFO, WARN, ERROR) in real time. Every anomaly gets flagged. Every latency spike gets correlated against upstream dependencies. We're not looking at metrics in isolation; we're looking at the entire causal chain. SLO-driven alerting, not threshold-based noise. We define error budgets. When a service starts burning through that budget faster than expected, we get ahead of it. We're not waiting for p99 latency to cross an arbitrary number someone set in 2019. Automated architectural health scoring. We continuously score the health of every node in our service topology, cache layers, databases, payment processors, inference services and surface degradation before it cascades. If the cache is running at 91% memory, we know what happens next to DB query load. We've seen that movie. Chaos Engineering: We Break Things So Production Doesn't This is the part people find uncomfortable until they've lived through a major outage that chaos testing would have caught. Chaos Engineering is the practice of deliberately injecting failures into your system in a controlled environment to discover weaknesses before they manifest in production. Not randomly, not recklessly but scientifically. You form a hypothesis ("the payment service should degrade gracefully if DNS resolution fails"), you run the experiment, you measure the blast radius. Here's what our chaos suite actually exercises: Pod kills and CrashLoopBackOff simulation - what happens when a critical container dies and starts restart-looping? Does the rest of the system route around it or does it take everything down with it? Memory pressure and OOM kill scenarios - we push services to their memory ceiling and watch what breaks. KV-cache tensor leaks in ML inference are a real thing. Better to find them in chaos than at 3 AM on a Friday. Network partitions and DNS failures - we simulate the kind of CNI issues that happen silently after a node pool upgrade. TCP retransmit spikes, DNS NXDOMAIN responses, TLS handshake timeouts to external payment processors, all of it. Latency injection and circuit breaker validation - we add synthetic latency to upstream dependencies to verify that circuit breakers actually open, retry budgets actually enforce limits, and fallback paths actually work. Configuration corruption - a bad ConfigMap with an invalid Redis bind address (yes, 0.0.0.256 is a real incident we've learned from) will crash every container that depends on it. Does your admission webhook catch that before it ships? Ours does now. The goal isn't to create chaos. The goal is to find out what your system does under pressure before pressure finds you. Every experiment has a defined steady state, a controlled injection, and a measured impact. We track blast radius, observe cascade behavior, and validate that our resilience mechanisms hold. Teams that don't do chaos engineering are running the same experiments; they just don't control the timing or the scope. RCA at Machine Speed: From Incident to Root Cause in Minutes This is where we think we've built something genuinely different. Traditional Root Cause Analysis is a postmortem ritual. Something breaks, engineers scramble, logs get grep'd, someone finally figures out that a ConfigMap change at 11:48 UTC triggered a cache crash that caused a DB query storm. That process takes hours if you're lucky and days if you're not. We've automated it. Our RCA engine ingests raw log streams across every pod in the topology, simultaneously. It runs anomaly detection, correlates error sequences across service boundaries, builds a causal graph, scores hypotheses by confidence, and surfaces remediation steps. The whole pipeline runs in seconds. What does that look like in practice? When a CrashLoopBackOff hits cache-5e3, the system doesn't just alert that a pod is down. It tells you: Container exits at startup with exit code 1. Error references invalid bind address 0.0.0.256. ConfigMap was bumped to v14 at 11:48 UTC. DB query load is up 340% consistent with cache unavailability. Confidence: 95%. Fix the ConfigMap, rollout restart, add admission webhook validation. That's not a human spending three hours in logs. That's a machine doing signal correlation at a scale no human can match, so the human can spend their energy on the fix instead of the diagnosis. Our confidence scoring matters too. Not every incident is a 95% certainty. Some are network partition symptoms, DNS failures plus TCP retransmit spikes plus TLS timeouts, that correlate at 79% confidence with a CNI issue after a node upgrade. The system tells you what it knows, what it's uncertain about, and what evidence it's weighing. That's a different class of tooling than a plain log aggregator. Why This Matters Now More Than Ever AI infrastructure is not like traditional web services. You're running GPU workloads, KV-cache-heavy inference pods, streaming inference pipelines, and multi-tenant models serving, all of which have failure modes that didn't exist five years ago. OOM kills on ML inference pods don't look like OOM kills on a Node.js service. Cache pressure patterns are different. Latency profiles are different. The complexity of modern distributed systems has outpaced our ability to operate them manually. The teams that will win the next five years aren't the ones with the most engineers on-call, they're the ones who've built systems smart enough to understand themselves. That's what SRE, Chaos Engineering, and AI-powered RCA are actually about. Not dashboards. Not on-call schedules. Not postmortems after the fact. Reliability by design. Resilience under pressure. Root cause in minutes, not days. Building something in this space or thinking through your own reliability stack? We'd love to compare notes. Drop a comment or reach out directly.

  • Choosing the Right Cloud Expense Management Tools

    Managing cloud expenses effectively is no longer just a finance problem; it’s an operational necessity. As cloud adoption scales, tracking and optimizing costs across distributed engineering teams becomes incredibly complex. Selecting the right cloud expense management tool helps organizations gain visibility, curb runaway spend, and maximize their infrastructure investments. But with dozens of platforms on the market, how do you separate high-level dashboards from tools that actually drive engineering action? Let’s explore the key factors, frameworks, and practical steps for choosing a tool that aligns with both your finance goals and engineering workflows. Understanding Cloud Expense Management Tools Cloud expense management platforms are designed to monitor, analyze, and optimize cloud spending. They break down native cloud billing data to provide insights into usage patterns, identify cost-saving opportunities, and enforce budget controls. While legacy tools simply report on historical data, modern solutions focus on actionable optimization. Core features typically include: Cost Allocation & Tagging: Assigning infrastructure costs directly to specific departments, products, or engineering teams. Budgeting & Forecasting: Setting spend thresholds and using historical data to predict future cloud bills. Anomalous Spend Alerts: Real-time notifications when a rogue resource or misconfigured pipeline spikes costs. Rightsizing Automation: Recommending or automatically executing shifts to smaller, more efficient instance sizes or scheduling shutdowns for idle environments. The ideal tool shouldn't just aggregate data; it needs to translate complex multi-cloud bills into clear, bite-sized tasks for developers. Critical Factors When Evaluating Tools When performing a cloud cost management tools comparison, look beyond basic cost dashboards and evaluate platforms against these operational requirements: Granular Multi-Cloud & Container Support Most enterprises rely on hybrid or multi-cloud environments (AWS, Azure, GCP). Your tool must unify these streams into a single pane of glass. Furthermore, if you run microservices, ensure the tool drills down into Kubernetes cluster layers (namespaces, pods, and requests) rather than just tracking the underlying virtual machines. Integration with Engineering Workflows This is where traditional tools fail. If a tool requires your developers to log into a separate finance dashboard to see savings recommendations, they won't use it. Look for platforms that integrate directly with existing IT and development pipelines, such as Jira or Slack, so cost optimization becomes part of standard sprint cycles. Granular and Flexible Cost Allocation Accurate cost allocation is the foundation of financial accountability. The tool must handle messy, real-world tagging environments, mapping shared resources (like database clusters or data transfer fees) equitably across various teams and projects. Non-Disruptive Automation Features Automation reduces manual overhead, but it must be safe. Look for tools that detect idle resources, suggest scheduled shutdowns for non-production environments, and offer performance-benchmarked rightsizing options so you never sacrifice speed for savings. Transparent Pricing Models Some vendors tie their pricing to a percentage of your total cloud spend. This creates a conflicting incentive: the more money they save you, the less they make. Prioritize tools with transparent, predictable pricing tiers based on scale or feature sets rather than a tax on your cloud bill. The Landscape: Legacy Platforms vs. Native Tools Cloud Providers (Native) [e.g., AWS Cost Explorer, Azure Cost Management]: Best for single-cloud setups and basic budget tracking. The catch is that they lack multi-cloud cross-visibility and default to vendor-biased infrastructure recommendations. Enterprise Financial Legacy [e.g., CloudHealth, Cloudability]: Best for massive enterprises focused solely on high-level executive FinOps reporting. The catch is that they often feature clunky UIs, remain isolated from developer workflows, and carry a high cost of entry. Next-Gen Developer-Centric [e.g., CloudNudge]: Best for modern tech teams, multi-cloud setups, and containerized infrastructures. They focus on generating actionable engineering tasks rather than static financial accounting. How to Systematically Execute Your Evaluation To choose the best fit for your organization, follow this structured evaluation process: Define Your True Objectives: Are you trying to reduce immediate cloud waste, fix a broken tagging governance policy, or provide multi-cloud visibility to your executive team? Audit Your Current Infrastructure Stack: Document your cloud providers, container usage, and internal toolsets (e.g., Jira, Confluence, CI/CD tools) to ensure ecosystem compatibility. Request Dev-Focused Demos: When viewing vendor demos, bring an engineering lead into the room. Don't just look at the executive financial graphs, ask to see exactly how an engineer receives and executes a rightsizing recommendation. Run a Controlled Proof-of-Concept (PoC): Connect candidate tools to a single non-production account or cluster. Evaluate how cleanly the platform surfaces hidden waste and check the accuracy of its recommendations over a 14-day window. Best Practices for a Successful Implementation Once you have selected a platform, maximize its ROI by establishing clean cloud hygiene: Implement Consistent Tagging: Build a standardized, automated tagging policy (e.g., Owner, Environment, Project) before rolling out the tool to ensure clean data parsing. Set Tiered Alerts: Configure budget alerts to trigger progressively (e.g., at 50%, 75%, and 90% of expected monthly spend) to catch anomalies before they impact the bottom line. Bridge the Finance-Engineering Divide: Create regular, cross-functional review sessions. Use the tool’s data as a shared source of truth to align engineering velocity with financial guardrails. Moving Forward with Cloud Cost Control Choosing the right cloud expense management tool is a foundational step toward long-term operational efficiency. By selecting a platform that satisfies finance requirements while actively respecting engineering velocity, you turn cloud cost optimization from a monthly headache into an ongoing competitive advantage.

  • ResNet50 Performance Study

    using PyTorch on ARM and x86 CPUs CPU Inference Benchmarking · ARM vs x86 · W8A8 Quantization Overview ResNet50 is a convolutional neural network built using bottleneck residual blocks of the form: 1×1 Conv → 3×3 Conv → 1×1 Conv + Skip Connection Among these layers, the 3×3 convolution layers dominate execution time, making Conv2d the primary hotspot during inference. Although ResNet50 performs ~4 GFLOPs per inference, it is not compute-heavy enough to fully utilize modern CPUs. Instead, the workload is highly memory-traffic intensive, where cache efficiency, memory bandwidth, and tensor layout become critical performance factors. Key Study Axes The following dimensions were studied while analyzing ResNet50 inference performance on ARM and x86 systems using PyTorch: Latency vs Batch Size Precision Study (FP32 / FP16 / INT8) Thread Scaling Process Scaling Memory Format Study (channels_last) 1. Latency vs Batch Size Increasing batch size improves throughput initially, but after a threshold (typically batch size 32–64), throughput gains flatten while latency increases significantly. This behavior indicates: cache overflow increased DRAM traffic memory bandwidth saturation Hence, ResNet50 behaves primarily as a memory-bound workload on CPUs. 2. Precision Study FP16 inference reduces tensor size and memory bandwidth requirements. However, on CPUs—especially ARM CPUs—the gains from FP16 are generally modest compared to GPUs. Observed behavior: FP16 gives limited latency improvement Benefits come mainly from reduced memory traffic INT8/W8A8 inference provides larger gains 3. Thread Scaling Increasing thread count improves performance only up to a point. Beyond that: cache contention increases memory bandwidth becomes saturated scaling efficiency drops This is evident from reduced parallel efficiency at higher core counts. 4. Process Scaling Running multiple inference processes increases resource contention: cache thrashing NUMA pressure memory bandwidth contention Typically, a moderate number of processes provides the best latency/throughput tradeoff. 5. Memory Format Study (channels_last) — Critical Observation This area still requires deeper study but already shows strong potential. PyTorch tensors by default use the NCHW (channels-first) layout: [N, C, H, W] In this format: channel blocks are contiguous spatial access patterns become inefficient for convolution kernels CPUs frequently "jump around memory" This leads to: poor spatial locality higher cache misses lower SIMD/vector efficiency channels_last (NHWC) Using: model = model.to(memory_format=torch.channels_last)inp = inp.to(memory_format=torch.channels_last) changes tensor layout to: [N, H, W, C] In this layout: pixels (H×W) are contiguous memory access becomes more sequential cache prefetching improves SIMD/vector units are utilized more efficiently Intuition NCHW → "jump around memory to compute" NHWC → "stream through memory smoothly" CPUs generally prefer streaming memory access patterns. channels_last is often the single easiest optimization to unlock 20–40% performance improvement for convolution-heavy workloads like ResNet50. This is particularly important on ARM systems where workloads are strongly memory-bandwidth bound. ResNet50 W8A8 — Latency & Throughput Workload: ImageNet validation (imagenette2-320/val) Batch Size: 1 Platform Variant Cores Latency (ms) Throughput (img/s) Speedup vs 1-core Parallel Efficiency ARM Unfused 1 584.8 1.7 1.00× 100.0% ARM Unfused 4 202.4 4.9 2.89× 72.2% ARM Unfused 8 133.7 7.5 4.37× 54.7% ARM Fused 1 422.6 2.4 1.00× 100.0% ARM Fused 4 115.7 8.6 3.65× 91.3% ARM Fused 8 62.7 15.9 6.74× 84.3% AMD Unfused 1 19.6 51.0 1.00× 100.0% AMD Unfused 4 7.1 140.8 2.76× 69.0% AMD Unfused 8 5.9 169.5 3.32× 41.5% Fusion Benefit — ARM Neoverse-N1 Conv + BatchNorm + ReLU Fusion Cores Unfused (ms) Fused (ms) Speedup Ops Tracked 1 584.8 422.6 1.38× 160 → 41 4 202.4 115.7 1.75× 160 → 41 8 133.7 62.7 2.13× 160 → 41 Fusion significantly reduces: operator dispatch overhead intermediate memory movement synchronization points The benefits become more pronounced at higher core counts. Cross-Platform Comparison — AMD vs ARM Cores AMD (ms) ARM Unfused (ms) ARM Fused (ms) AMD Faster than Unfused AMD Faster than Fused 1 19.6 584.8 422.6 29.8× 21.6× 4 7.1 202.4 115.7 28.5× 16.3× 8 5.9 133.7 62.7 22.7× 10.6× Even after fusion optimizations, x86/AMD platforms continue to outperform ARM significantly for this workload. However, fusion and memory-layout optimizations substantially improve ARM scaling efficiency. Conclusion ResNet50 inference on CPUs is largely memory-bound rather than compute-bound. Performance is strongly influenced by: tensor memory layout cache locality operator fusion memory bandwidth utilization Among all optimizations studied, operator fusion and channels_last memory format stand out as the most impactful CPU-side improvements, especially on ARM systems where memory behavior dominates overall performance.

  • Measuring the Unmeasurable: A Benchmarker's Guide to Agentic AI

    For decades, AI benchmarks lived in comfortable isolation. A model answered a question, we checked the answer, we assigned a score. Agentic AI broke that contract. When a model can browse the web, write and execute code, call external APIs, and chain its own decisions across hundreds of steps, a single accuracy number tells you almost nothing about whether the system is actually trustworthy. Evaluating an agent is less like grading an exam and more like auditing a junior employee after six months on the job. You're not looking for one right answer; you're looking at judgment, reliability, efficiency, and what happens when things go sideways. Why Static Benchmarks Fall Short The classics, MMLU, HumanEval, GSM8K, measure a model's world knowledge and single-shot reasoning. They are reproducible, cheap to run, and well-understood. But they share a fatal assumption: the model receives a complete, well-specified problem and produces a terminal answer. Agentic systems are different in kind, not just degree. They operate across time. They consume tool outputs as new evidence. They recover from or compound earlier mistakes. A model that scores 90% on HumanEval can still fail catastrophically in a multi-step coding agent if it can't recover from a failing test suite, manage a growing context window, or decide when to stop and ask a human for clarification. The other problem is contamination. In agentic settings, if a model has seen a task's solution format during training, it can pattern-match to a successful trajectory without actually demonstrating planning ability. This makes held-out, procedurally generated tasks essential and rare. The Four Dimensions That Actually Matter Modern agentic evaluation has converged on four core challenges that go well beyond accuracy. Long-horizon task completion. Can the agent decompose a complex goal into sub-tasks, execute them in sequence, and adapt when intermediate results deviate from expectations? Benchmarks like WebArena, AgentBench, and GAIA probe this dimension. The key signal isn't whether the agent gets to the right answer it's whether the path it took was coherent. Tool use precision. Does the agent call the right tool, with the right arguments, at the right moment? Spurious tool calls inflate cost and latency; missed calls stall progress. A rigorous eval tracks both false positives and false negatives in tool selection, not just whether the final output was correct. Error recovery and replanning. When a tool returns an unexpected result or an action fails, does the agent update its plan intelligently or get stuck in a retry loop? Recovery rate at the step immediately following a failure event is one of the most diagnostic single metrics in the field. Safety and boundary compliance. Does the agent stay within its sanctioned scope? A system that can write files, send emails, or execute arbitrary code needs adversarial safety evaluation as a first-class benchmark dimension not an afterthought bolted on at the end. A Survey of the Leading Benchmarks The field has moved fast. Here are the most influential agentic benchmarks and what they're actually measuring. SWE-bench Verified has emerged as the dominant single-number signal for coding agents. It presents real GitHub issues and asks agents to produce patches that pass the associated test suites. As of mid-2026, leading systems solve roughly 35–40% of verified tasks. The catch: SWE-bench measures patch generation on pre-existing repos, not greenfield development, architectural decisions, or cross-repo refactoring — skills that dominate real engineering work. WebArena grounds agents in live web environments. Tasks involve navigating e-commerce sites, forums, and productivity tools to accomplish realistic goals. The dynamic nature of the web makes reproducibility hard, which is both a feature (it's realistic) and a bug (it's hard to compare runs across time). GAIA (General AI Assistant) is a multi-step reasoning benchmark where tasks require combining web search, file reading, and multi-hop inference. It has a useful three-level difficulty tiering and remains one of the harder benchmarks for frontier models. τ-bench focuses on customer service and tool-use policy compliance testing whether agents follow rules, handle edge cases correctly, and know when to escalate to a human. It's particularly useful for teams deploying agents in regulated or customer-facing contexts. OSWorld evaluates agents on real desktop operating system tasks manipulating files, navigating GUIs, running applications. It uses reproducible OS snapshots, which addresses the environment instability problem at the cost of some realism. Metrics Beyond Task Completion Rate Raw task completion is necessary but not sufficient. A serious agentic evaluation program tracks a richer set of signals. Trajectory efficiency the ratio of meaningful steps to total steps, penalizes agents that succeed only through excessive retries or brute-force looping. A 90% success rate achieved by burning 400 tokens per step is not the same product as 85% success at 40 tokens per step. Both completion rate and cost per completed task need to be reported together. Steps to first error measures how far into a task an agent gets before making a mistake. This is a useful robustness signal independent of final task success, an agent that fails on step 2 of 20 is different from one that fails on step 18. Calibration under uncertainty is perhaps the most underrated dimension. Does the agent know when to ask a human for clarification versus when to proceed confidently? An overconfident agent that silently takes irreversible actions deleting files, sending emails, making API calls with side effects under conditions of ambiguity is more dangerous than one that fails loudly and asks for help. Cost per intent treats the entire computational spend (tokens, tool calls, latency) as a function of the user's original goal. This forces evaluation to account for the reality that agentic systems must eventually be economically viable, not just technically impressive. The Open Problems Despite rapid progress, agentic benchmarking faces several hard unsolved problems that make today's leaderboards more provisional than they appear. Environment reproducibility is a persistent headache. Agentic tasks that involve live APIs, dynamic websites, or real file systems are inherently non-deterministic. A task that passes today may fail tomorrow because a webpage layout changed or an API was deprecated. Snapshot-based environments partially address this but introduce their own staleness problem. Reward hacking and specification gaming are endemic. Agents optimized against a specific benchmark learn to satisfy the evaluation harness rather than the underlying intent. Passing unit tests doesn't mean correct behavior; a green eval doesn't mean a trustworthy agent. Red-teaming the evaluation itself trying to find ways an agent could score well without doing the right thing should be a standard practice, not an exotic one. The human baseline problem. Many agentic benchmarks lack credible human performance baselines. When a model "achieves human-level performance" on GAIA, the question deserves scrutiny: which humans, under what time constraints, with access to which tools? Without anchored and well-documented human baselines, superhuman claims are marketing, not science. The attribution problem. Agentic systems are stacks: the LLM backbone, the scaffolding code, the tool implementations, the system prompt, the context management strategy. When a benchmark score improves, which layer improved? Attribution is nearly impossible without controlled ablations and ablations at agentic scale are expensive. This makes it hard to understand whether progress is coming from better models or better engineering around the model. What Good Practice Looks Like The teams doing this rigorously share a set of habits that distinguish serious evaluation from leaderboard chasing. They use held-out test sets with versioned environment snapshots, never reusing the same task instances across runs. They generate task variants procedurally so that memorization can't masquerade as capability. They report distributions, not point estimates. Agentic runs are high-variance. A 5-point improvement that doesn't clear the confidence interval is not a finding it's noise. Error bars are not optional. They treat cost and latency as primary metrics, not secondary ones. If the real deployment constraint is "under 30 seconds at less than five cents per task," that constraint belongs in the eval specification, not in a footnote. They read the trajectories. Aggregate metrics mask systematic failure modes that only become obvious when you examine 50 actual step-by-step traces by hand. The most valuable evaluation sessions involve a human analyst reading failures and asking "why did it do that?" Where This Is Heading The next frontier is longitudinal evaluation, measuring agent performance not on isolated tasks but on continuous, multi-session workflows where earlier actions have persistent consequences. An agent that maintains a codebase over weeks. An operations agent that manages infrastructure over months. These evaluations don't exist in mature form yet, but they're the only ones that will tell us whether agentic AI is genuinely trustworthy for high-stakes autonomous operation. Building them will require collaboration between AI labs, the enterprise teams deploying these systems, and the evaluation research community. It will require treating benchmarking itself as a first-class research problem, not a necessary evil before the real work begins. In the meantime, the best posture for anyone building or procuring agentic systems is healthy skepticism toward any single headline number, and sustained investment in the unglamorous, expensive, essential work of task-specific evaluation tailored to the actual deployment context. The measure of an agent is not how well it performs on a benchmark. It's how well it performs in production, under conditions the benchmark never anticipated.

  • AIML Classifier - Log Analyzer

    Objective Building an AI-powered system that automatically identifies and classifies software errors into meaningful categories, and provides root cause analysis and recommendations. Challenge Solution Developed multiple machine learning models to classify errors within seconds Integrated retrieval-augmented generation (RAG) for Root cause analysis Used Large language Models (LLMs) for providing narratives and recommendations Benefits

  • Adapting Strapi CMS for your implementation

    Strapi is an open-source, API-first headless Content Management System (CMS) designed to manage structured data and expose it through RESTful services. In modern web development, Strapi excels by decoupling content management from the presentation layer. This allows teams to iterate on backend data models without requiring a full rebuild or redeploy of the frontend. Why Strapi? For this implementation, we required a solution that balanced developer flexibility with a user-friendly interface for operational teams. Key drivers included: Dynamic Modeling: Seamlessly managing site registries, milestones, and build-date metadata. Operational Autonomy: A built-in admin panel that allows non-technical users to manage data. Workflow Automation: Leveraging Lifecycle Hooks to automate internal notifications. Scalability: A robust plugin ecosystem for authentication and email integration. Installation and Setup of Strapi Prerequisites : Node.js ,npm Our environment utilizes Strapi v5 configured with TypeScript for type safety, custom plugins, and advanced lifecycle logic. # Initialize the project npx create-strapi-app@latest my-project To ensure environment consistency, the service is containerized via Docker: Internal Container Port: 1337 External Host Port: 8008 Content Modeling Data Architecture We designed the schema to ensure data integrity while remaining flexible enough for changing project requirements. Sites Fields: site_name,dc_code, region, site_owner_name, site_owner_email Purpose: Site registry and Site ownership attribution. Milestone Fields: display_name, sort_order, owner_person_name, owner_person_mail_id Purpose: Dynamic milestone definitions and Milestone owner mapping. Build Dates Fields: site_name, dc_code, architecture, system_count, milestones Purpose: Build scheduling records per site/DC. Component in use Milestone is a repeatable component attached to Build Dates.This structure supports dynamic milestone columns without redesigning the Build Date schema whenever milestone definitions change display_name date risk_enabled risk_notes (conditionally required when risk is enabled) Authentication and Roles Built-in authentication The project includes Strapi authentication foundations through: Admin JWT secret configuration. Users and permissions plugin dependency. Strapi supports registration/login and JWT-based flows. In this project, authentication is especially relevant for admin workflows and role-driven data visibility. Invitation and onboarding workflow The project extends admin user provisioning through email invite logic: Admin invite is sent when the admin creates a user. Column owner invite is sent when milestone owner is assigned. Site owner invite is sent when site owner is assigned. Role-based access control used in project logic: The admin UI differs by role in two major ways: Left navigation visibility for collection types. Data-level visibility in Build Dates (row filtering and milestone filtering). Custom role-sensitive filtering is implemented in Build Date lifecycles: Super Admins receive unrestricted access. Site owners are filtered to their owned sites. Milestone owners are filtered to assigned milestones.

  • Simplify Kubernetes Management with Python: Managing Kubernetes with Python

    Kubernetes has become the de facto standard for container orchestration, powering modern cloud-native applications. However, managing Kubernetes clusters can be complex and time-consuming, especially when dealing with multiple environments or automating repetitive tasks. Fortunately, Python offers a powerful way to simplify Kubernetes management through automation and scripting. In this article, we will explore how you can leverage Python to streamline your Kubernetes operations. We will cover practical examples, tools, and best practices to help you get started with managing Kubernetes using Python effectively. Managing Kubernetes with Python: Why It Matters Kubernetes management involves tasks such as deploying applications, scaling workloads, monitoring cluster health, and managing resources. Doing these manually through the Kubernetes dashboard or `kubectl` commands can be error-prone and inefficient. Python, with its rich ecosystem and readability, provides an excellent option for automating these tasks. By using Python scripts, you can: One of the key enablers for this is the python kubernetes client, a comprehensive library that allows you to interact with the Kubernetes API directly from Python code. This client abstracts the complexity of API calls and provides a user-friendly interface to manage your clusters. Getting Started with the Python Kubernetes Client To begin managing Kubernetes with Python, you first need to install the official Kubernetes client library. You can do this easily using pip: ```bash pip install kubernetes ``` Once installed, you can write Python scripts that connect to your Kubernetes cluster. The client supports various authentication methods, including kubeconfig files and in-cluster configurations. Here is a simple example that lists all pods in the default namespace: ```python from kubernetes import client, config Load kubeconfig and initialize client config.load_kube_config() v1 = client.CoreV1Api() List pods in the default namespace pods = v1.list_namespaced_pod(namespace="default") for pod in pods.items: print(f"Pod name: {pod.metadata.name}") ``` This script demonstrates how straightforward it is to interact with Kubernetes resources using Python. You can extend this approach to create, update, or delete resources as needed. Automating Common Kubernetes Tasks with Python Automation is where Python truly shines in Kubernetes management. Here are some practical examples of tasks you can automate: 1. Deploying Applications You can write Python scripts to create deployment objects, set replicas, and manage container images. This is useful for continuous deployment pipelines. ```python from kubernetes.client import V1Deployment, V1DeploymentSpec, V1PodTemplateSpec, V1ObjectMeta, V1Container, V1LabelSelector deployment = V1Deployment( metadata=V1ObjectMeta(name="nginx-deployment"), spec=V1DeploymentSpec( replicas=3, selector=V1LabelSelector(match_labels={"app": "nginx"}), template=V1PodTemplateSpec( metadata=V1ObjectMeta(labels={"app": "nginx"}), spec=client.V1PodSpec(containers=[V1Container(name="nginx", image="nginx:1.14.2")]) ) ) ) apps_v1 = client.AppsV1Api() apps_v1.create_namespaced_deployment(namespace="default", body=deployment) print("Deployment created successfully.") ``` 2. Scaling Workloads Adjusting the number of replicas in a deployment can be automated based on metrics or schedules. ```python def scale_deployment(name, namespace, replicas): apps_v1 = client.AppsV1Api() deployment = apps_v1.read_namespaced_deployment(name, namespace) deployment.spec.replicas = replicas apps_v1.patch_namespaced_deployment(name, namespace, deployment) print(f"Scaled deployment {name} to {replicas} replicas.") scale_deployment("nginx-deployment", "default", 5) ``` 3. Monitoring and Alerts You can fetch pod statuses and send alerts if any pods are in a failed state. ```python pods = v1.list_namespaced_pod(namespace="default") for pod in pods.items: if pod.status.phase != "Running": print(f"Alert: Pod {pod.metadata.name} is in {pod.status.phase} state.") ``` These examples illustrate how Python scripts can replace manual commands, saving time and reducing errors. Best Practices for Managing Kubernetes with Python To make the most of Python in Kubernetes management, consider the following best practices: By following these guidelines, you can build robust automation tools that enhance your Kubernetes management workflow. Expanding Your Kubernetes Automation Toolkit Beyond the basic client library, there are additional Python tools and frameworks that can further simplify Kubernetes management: Kopf: A Python framework for writing Kubernetes operators, allowing you to extend Kubernetes with custom controllers. Helm with Python: Use Python scripts to automate Helm chart deployments and upgrades. Kubectl Wrapper Libraries: Some Python libraries wrap `kubectl` commands for easier scripting. Exploring these tools can help you build more sophisticated automation solutions tailored to your specific needs. Managing Kubernetes clusters can be complex, but with Python, you gain a powerful ally to simplify and automate your workflows. Whether you are deploying applications, scaling services, or monitoring cluster health, Python scripts can save you time and reduce errors. Start by exploring the python kubernetes client and experiment with small automation tasks. Over time, you can build a comprehensive toolkit that makes Kubernetes management more efficient and reliable.

  • Our experiences with running Strapi in cluster mode

    One way to scale a Node-based system is to run multiple instances of the server. This approach also works well for Strapi because Strapi doesn't store anything in-memory on the server-side (no sticky sessions). The JWT tokens it issues persist in the database. So, any time we observe a Strapi setup struggling to handle the load of requests on the Node side, we add more instances running the same code. For setups with a predictable workload, pm2 offers a simple way to manage multiple Strapi server processes. However, when we ran Strapi in cluster mode via pm2, we realized we needed to be careful about a few things that we didn't encounter when running a single Strapi instance: 1. Issues encountered 1.1 Strapi schema changes at startup With Strapi, the schema is stored within our code. As a result, every time Strapi starts, it ensures the underlying database schema is brought in-sync with the schema defined in code. Additionally, any data-migration scripts (stored within `database/migration/` folder within the code repository) are run at Strapi startup (if not previously run).​ Because of the above design, when we ran Strapi in cluster-mode, it caused more than one Strapi processes to trigger these database-side changes. This lead to issues we had not observed running a single Strapi instance. 1.2 Strapi cron jobs Strapi can be [configured]( https://docs.strapi.io/dev-docs/configurations/cron ) to run cron jobs. This is a very helpful feature because it allows us maintain our task scheduling related setup along with our CMS setup (no separate code repository, infrastructure or devops for CMS-specific scheduled jobs). However, when we ran Strapi in cluster-mode, each of the running Strapi instances triggered the scheduled cron jobs. As a result, on our setup with four Strapi instances, a scheduled task to trigger email alerts ended up sending four emails! 2. Solution Approach To solve the above detailed issues, we realized we wanted a solution that would help us achieve the following: A way for a running Strapi instance to identify itself either as a `primary` or a `secondary` server. Doing so would allow us to only have the `primary` instance perform tasks like triggering cron tasks. A way to initialize only a single Strapi instance first. Rest of the Strapi instances should start only after the first one is up and running. This would ensure that the initialization tasks like running database migration scripts or model schema sync aren't performed more than once. 3. Implementation 3.1 Segregating the running Strapi instances into primary & secondary We achieved this with `pm2` variable called `NODE_APP_INSTANCE`. When `pm2` starts any node process, it assigns a unique & incrementing value to `process.env.NODE_APP_INSTANCE` to each of the started node processes. The first started instance would have the value `0`. The second instance would have the value `1` and so on. So, with the following check, a running Strapi process could identify if it was a `primary` or a `secondary`: const { sendEmailAlerts } = require('./cronSendEmailAlerts'); module.exports = { sendEmailAlerts: { task: async () => { if (typeof process.env.NODE_APP_INSTANCE === "undefined" || (typeof process.env.NODE_APP_INSTANCE !== "undefined" && parseInt(process.env.NODE_APP_INSTANCE) === 0)) return await sendEmailAlerts(); else return false; }, options: { rule: "59 11 * * *", }, } };​​ 3.2 Controlling the sequence of starting Strapi instances To start only a single Strapi instance first and start the other instances later, we leveraged `pm2` API called `sendDataToProcessId()`. This API enables inter-process communication between various pm2 initialized processes. Hereby, instead of starting Strapi via the regular `strapi start`, we wrote a script where: The first Strapi instance could start right away but the other Strapi instances would wait for a signal from the first instance. The first Strapi instance could send a signal to rest of the Strapi instances once it is up and running. #!/usr/bin/env node 'use strict'; const strapi = require('@strapi/strapi'); const pm2 = require('pm2') let performStrapiStart = false; //logic for starting the primary instance if (parseInt(process.env.NODE_APP_INSTANCE) === 0) { if (!performStrapiStart) { //Start the primary Strapi instance performStrapiStart = true; strapi().start(); } pm2.list((err, list) => { const procStrapi = list.filter(p => p.name == process.env.PM2_APP_NAME); //We check every 500 msec if Strapi started const intervalCheckPrimaryInit = setInterval(function(){ //global.strapi.isLoaded turns to true once Strapi is running if (global.strapi.isLoaded) { clearInterval(intervalCheckPrimaryInit); //Time to communicate rest of the running Strapi instance processes //to start Strapi for (let s=0;s<procStrapi.length;s++) { if (parseInt(procStrapi[s].pm2_env.pm_id) !== parseInt(process.env.NODE_APP_INSTANCE)) { pm2.sendDataToProcessId(procStrapi[s].pm_id, { data : { primaryInitDone : true }, topic: 'process:msg', type: 'process:msg' }, (err, res) => { if (err) console.log(err) }); } } } }, 500); }); } //logic for starting the secondary Strapi instances else { process.on('message', function (data) { if (!performStrapiStart && data.data.primaryInitDone) { performStrapiStart = true; strapi().start(); } }); } On starting Strapi via the above script using `pm2` in cluster mode, we could now control the sequence of starting of Strapi instances. 4. Conclusion Running Strapi in cluster mode via `pm2` allows us scale our CMS setup. But, having more than once Strapi instances running can cause some issues. Hereby, having an ability to uniquely identify each running Strapi instance and enable inter-process communication between them allows us to adequately solve any such issues resulting from a multiple-instance setup.

  • Beyond the Bill: Why Performance Benchmarking is the Secret to Sustainable Cloud Savings

    Introduction In our previous post, How CloudNudge Can Help You Optimize and Manage Your Cloud Expenses, we discussed how visibility is the first step toward financial control. However, for software and hardware engineers, a low cloud bill is a hollow victory if it comes at the cost of system latency. Saving money is great. Saving money without breaking your application is Performance Engineering. The Performance-Cost Paradox The most common mistake in cloud optimization is "Blind Downsizing." This happens when a team sees an underutilized instance and immediately scales it down to a cheaper tier. The result? Unexpected bottlenecks during peak traffic and a degraded user experience. To achieve true efficiency, you must find the "Sweet Spot" where cost and performance intersect. How Whileone Techsoft Validates Your Savings While CloudNudge identifies where you are overspending, Whileone Techsoft’s benchmarking services tell you how low you can go without risking a crash. We bridge the gap through: Data-Driven Rightsizing: We use real-world stress tests to ensure that a smaller instance can actually handle your high-concurrency workloads. Code Optimization vs. Hardware Scaling: Sometimes the "cost" isn't the server; it's the code. Our benchmarking identifies "performance leaks," allowing you to fix the software rather than paying for more hardware. Sustainable Scaling: In line with the CloudFest 2026 theme of "The Sustainability of Everything," we believe the greenest cloud is the one that uses exactly what it needs nothing more, nothing less. Conclusion True cloud management isn't just about cutting costs; it’s about maximizing the ROI of every millisecond of compute time. By pairing CloudNudge’s visibility with Whileone’s performance validation, you aren't just saving money, you’re building a leaner, faster, and more sustainable infrastructure.

bottom of page