<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.4 20241031//EN" "JATS-journalpublishing1-4.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" article-type="research-article" dtd-version="1.4" xml:lang="en">
  <front>
    <journal-meta>
      <journal-id journal-id-type="publisher-id">jcc</journal-id>
      <journal-title-group>
        <journal-title>Journal of Computer and Communications</journal-title>
      </journal-title-group>
      <issn pub-type="epub">2327-5227</issn>
      <issn pub-type="ppub">2327-5219</issn>
      <publisher>
        <publisher-name>Scientific Research Publishing</publisher-name>
      </publisher>
    </journal-meta>
    <article-meta>
      <article-id pub-id-type="doi">10.4236/jcc.2026.1410001</article-id>
      <article-id pub-id-type="publisher-id">jcc-154674</article-id>
      <article-categories>
        <subj-group>
          <subject>Article</subject>
        </subj-group>
        <subj-group>
          <subject>Computer Science</subject>
          <subject>Communications</subject>
        </subj-group>
      </article-categories>
      <title-group>
        <article-title>A Comparative Analysis of Static Scaling, Kubernetes Horizontal Pod Autoscaling (HPA), and Kubernetes Event-Driven Autoscaling (KEDA) in Moodle LMS</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <name name-style="western">
            <surname>Achang’a</surname>
            <given-names>Robert</given-names>
          </name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <name name-style="western">
            <surname>Abade</surname>
            <given-names>Elisha</given-names>
          </name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <contrib contrib-type="author">
          <name name-style="western">
            <surname>Kahonge</surname>
            <given-names>Andrew</given-names>
          </name>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
      </contrib-group>
      <aff id="aff1"><label>1</label> Department of Computing and Informatics, University of Nairobi, Nairobi, Kenya </aff>
      <author-notes>
        <fn fn-type="conflict" id="fn-conflict">
          <p>The authors declare no conflicts of interest regarding the publication of this paper.</p>
        </fn>
      </author-notes>
      <pub-date pub-type="epub">
        <day>22</day>
        <month>10</month>
        <year>2026</year>
      </pub-date>
      <pub-date pub-type="collection">
        <month>10</month>
        <year>2026</year>
      </pub-date>
      <volume>14</volume>
      <issue>10</issue>
      <fpage>1</fpage>
      <lpage>19</lpage>
      <history>
        <date date-type="received">
          <day>01</day>
          <month>09</month>
          <year>2026</year>
        </date>
        <date date-type="accepted">
          <day>18</day>
          <month>10</month>
          <year>2026</year>
        </date>
        <date date-type="published">
          <day>21</day>
          <month>10</month>
          <year>2026</year>
        </date>
      </history>
      <permissions>
        <copyright-statement>© 2026 by the authors and Scientific Research Publishing Inc.</copyright-statement>
        <copyright-year>2026</copyright-year>
        <license license-type="open-access">
          <license-p> This article is an open access article distributed under the terms and conditions of the Creative Commons Attribution (CC BY) license ( <ext-link ext-link-type="uri" xlink:href="https://creativecommons.org/licenses/by/4.0/">https://creativecommons.org/licenses/by/4.0/</ext-link> ). </license-p>
        </license>
      </permissions>
      <self-uri content-type="doi" xlink:href="https://doi.org/10.4236/jcc.2026.1410001">https://doi.org/10.4236/jcc.2026.1410001</self-uri>
      <abstract>
        <p>Moodle is widely used to administer online examinations, but fixed-capacity deployments can become unstable when many learners log in, open quiz pages, and submit responses within the same examination window. This study evaluates three deployment strategies for a Moodle-based examination platform running on an on-premises Kubernetes cluster: static scaling, Kubernetes Horizontal Pod Autoscaling (HPA), and Kubernetes Event-Driven Autoscaling (KEDA). Apache JMeter generated workloads from 500 to 70,000 concurrent connections. Performance was assessed using average response time, 95th percentile latency, 99th percentile latency, throughput, and error rate. Static scaling degraded earliest: average response time increased from 328 ms at 500 concurrent connections to 10,347 ms at 2500 concurrent connections, while the error rate rose from 0% to 81% over the same interval. HPA produced the strongest reliability profile, maintaining 0% errors from 500 to 5000 concurrent connections and recording the lowest error rate among the three strategies at every workload from 10,000 to 70,000 concurrent connections. KEDA produced the strongest responsiveness among successful requests at several higher-load points, including 412 ms average response time at 10,000 concurrent connections and 1604 ms at 70,000 concurrent connections, and it achieved the highest throughput at most large workloads. However, KEDA’s error rate increased sharply after 5,000 concurrent connections, reaching 93.725% at 10,000 concurrent connections. The findings show that autoscaling improves Moodle performance compared with static provisioning, but HPA and KEDA optimize different parts of the performance envelope. For high-stakes online examinations, HPA is the safer reliability-oriented option in this dataset, while KEDA is promising when responsiveness and throughput are prioritized and its triggers are carefully tuned.</p>
      </abstract>
      <kwd-group kwd-group-type="author-generated" xml:lang="en">
        <kwd>Kubernetes</kwd>
        <kwd>Horizontal Pod Autoscaler</kwd>
        <kwd>Kubernetes Event-Driven Autoscaler</kwd>
        <kwd>Moodle</kwd>
        <kwd>Autoscaling</kwd>
        <kwd>Online Examination</kwd>
        <kwd>Performance Evaluation</kwd>
        <kwd>Peak Workload</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec1">
      <title>1. Introduction</title>
      <p>In scheduled online examinations, many candidates access the platform within the same examination window, authenticate almost at the same time, open quiz pages, save responses, and submit answers close to fixed deadlines. This concentration of activity makes examination traffic more demanding than ordinary LMS browsing or asynchronous course access. Digital learning and online assessment have therefore become central to higher education because institutions increasingly need platforms that can support content delivery, learner engagement, grading workflows, and high-stakes examinations at scale [<xref ref-type="bibr" rid="B1">1</xref>]-[<xref ref-type="bibr" rid="B3">3</xref>].</p>
      <p>Learning Management Systems (LMSs) provide the application layer through which these teaching, learning, and assessment processes are delivered. Moodle is a widely adopted open-source LMS that supports course management, quizzes, grading, and examination workflows [<xref ref-type="bibr" rid="B4">4</xref>][<xref ref-type="bibr" rid="B5">5</xref>]. This makes Moodle a suitable workload for studying the infrastructure behavior of online examination systems under peak demand. The shift from general LMS use to Moodle is therefore not only a platform choice; it is a practical way to evaluate how a real educational application behaves when many learners perform time-sensitive actions simultaneously.</p>
      <p>Many institutional Moodle deployments are still operated on fixed-capacity infrastructure. Static provisioning is simple to manage, but it offers no automatic response when demand exceeds the configured number of application instances. When demand rises quickly, the platform may respond slowly, queue requests, or fail requests altogether. Prior work on e-learning implementation has associated reliable online learning delivery with infrastructure readiness, technical capacity, and sustainable operational support [<xref ref-type="bibr" rid="B6">6</xref>]-[<xref ref-type="bibr" rid="B9">9</xref>]. In this study, that broader infrastructure concern is examined through the narrower and measurable problem of Moodle peak-load performance.</p>
      <p>Kubernetes provides a practical way to run and scale containerized applications. It manages replicated application instances across a cluster and can adjust capacity when workloads change [<xref ref-type="bibr" rid="B10">10</xref>][<xref ref-type="bibr" rid="B11">11</xref>]. Kubernetes autoscaling patterns commonly include Horizontal Pod Autoscaling (HPA), Vertical Pod Autoscaling (VPA), and event-driven scaling. Kubernetes Event-Driven Autoscaler (KEDA) extends Kubernetes scaling by allowing workloads to scale based on event sources and external metrics while integrating with Kubernetes autoscaling mechanisms [<xref ref-type="bibr" rid="B12">12</xref>]-[<xref ref-type="bibr" rid="B15">15</xref>].</p>
      <p>Online examinations provide a useful test case for comparing these approaches because examination traffic can change faster than ordinary e-learning usage. CPU-based scaling can provide a stable response once resource pressure is visible, but it may react only after demand has already affected the running pods. Event-driven scaling can react closer to a demand signal, but it may still be limited by polling intervals, pod startup time, database capacity, network capacity, and trigger thresholds. Recent research on Service Level Objective (SLO)-aware autoscaling also shows that adaptive scaling remains an active area of cloud-native performance research [<xref ref-type="bibr" rid="B16">16</xref>][<xref ref-type="bibr" rid="B17">17</xref>]. This study therefore compares static scaling, HPA, and KEDA using the same Moodle workload and the same performance indicators.</p>
    </sec>
    <sec id="sec2">
      <title>2. Research Gap and Contributions</title>
      <p>Prior studies on e-learning and online assessment have examined adoption challenges, assessment quality, and educational technology use, while cloud-native literature has described Kubernetes, autoscaling algorithms, and elastic resource management [<xref ref-type="bibr" rid="B6">6</xref>]-[<xref ref-type="bibr" rid="B11">11</xref>][<xref ref-type="bibr" rid="B16">16</xref>]-[<xref ref-type="bibr" rid="B23">23</xref>]. However, empirical evidence remains limited for Moodle-based online examination workloads that combine synchronized user actions, high reliability expectations, and containerized infrastructure. This gap matters because a platform that appears responsive under ordinary LMS activity may degrade sharply when examination users arrive in a concentrated window.</p>
      <p>This study addresses that gap by comparing static scaling, Kubernetes HPA, and KEDA under the same Moodle examination workload across 500 to 70,000 concurrent connections. It evaluates average latency, tail latency, throughput, and error rate together because examination readiness depends on both responsiveness and reliability. The results show a practical trade-off: HPA protected a larger share of requests from failure, while KEDA produced faster successful responses and strong throughput under several high-load conditions. Presenting the metrics separately keeps each finding tied to its unit, workload level, and scaling strategy.</p>
    </sec>
    <sec id="sec3">
      <title>3. Related Work</title>
      <sec id="sec3dot1">
        <title>3.1. E-Learning Infrastructure, Moodle, and Online Assessment</title>
        <p>E-learning research identifies infrastructure, policy, technical capacity, learner access, and implementation support as recurring factors that influence online learning delivery [<xref ref-type="bibr" rid="B6">6</xref>]-[<xref ref-type="bibr" rid="B9">9</xref>]. These issues are relevant to online examination systems because reliability depends on both the application and the infrastructure that supports high-concurrency access. Online formative assessment literature also emphasizes that assessment quality depends on dependable online environments, timely feedback, interaction, and continuity of access [<xref ref-type="bibr" rid="B1">1</xref>].</p>
        <p>Moodle was introduced as an open-source course management system designed around learning communities [<xref ref-type="bibr" rid="B4">4</xref>]. It has since become a widely used LMS for course delivery and assessment workflows. Official Moodle documentation and administrator guidance emphasize that production deployments require careful attention to web server configuration, database performance, caching, file storage, cron processing, and monitoring [<xref ref-type="bibr" rid="B5">5</xref>][<xref ref-type="bibr" rid="B24">24</xref>]. These concerns align with the present study because autoscaling Moodle application pods may not solve every bottleneck if the database, storage, ingress, or cache layer becomes saturated.</p>
        <p>From a performance-engineering perspective, examination workloads should be evaluated as workload-specific scenarios rather than as generic web traffic. Computer systems performance analysis emphasizes the need to define workload, metrics, measurement procedure, and interpretation criteria before drawing conclusions [<xref ref-type="bibr" rid="B25">25</xref>][<xref ref-type="bibr" rid="B26">26</xref>]. For this reason, the present study evaluates average response time, p95 latency, p99 latency, throughput, and error rate together. This helps avoid the misleading conclusion that a system is performing well merely because the requests that did succeed were fast.</p>
      </sec>
      <sec id="sec3dot2">
        <title>3.2. Kubernetes, Container Orchestration, and Autoscaling</title>
        <p>Kubernetes emerged from experience with large-scale container and cluster management systems and is now widely used for deploying and managing containerized workloads [<xref ref-type="bibr" rid="B10">10</xref>][<xref ref-type="bibr" rid="B11">11</xref>][<xref ref-type="bibr" rid="B27">27</xref>][<xref ref-type="bibr" rid="B28">28</xref>]. A Kubernetes deployment can run multiple replicas of an application pod and expose them through services and ingress components. This architecture makes horizontal scaling practical for stateless or mostly stateless application tiers, including the web/PHP tier of a Moodle deployment when shared storage, database, and session handling are configured appropriately.</p>
        <p>Autoscaling decisions are only as effective as the metrics and thresholds that guide them. Kubernetes HPA adjusts the number of pod replicas based on observed resource metrics or supported custom metrics [<xref ref-type="bibr" rid="B12">12</xref>][<xref ref-type="bibr" rid="B13">13</xref>]. This approach can be stable because it responds to measured utilization, but it can lag sudden demand spikes if CPU or memory pressure appears after queues have already formed. Research surveys on cloud elasticity and autoscaling similarly show that reactive scaling is useful but sensitive to metric choice, thresholds, cooldown behavior, and provisioning delay [<xref ref-type="bibr" rid="B18">18</xref>]-[<xref ref-type="bibr" rid="B23">23</xref>].</p>
      </sec>
      <sec id="sec3dot3">
        <title>3.3. KEDA and Event-Driven Autoscaling</title>
        <p>KEDA is a Kubernetes-based event-driven autoscaler that scales workloads using event sources and external metrics [<xref ref-type="bibr" rid="B14">14</xref>][<xref ref-type="bibr" rid="B15">15</xref>]. In contrast to basic resource-driven autoscaling, KEDA can connect scaling decisions to signals such as queue length, message backlog, Prometheus metrics, and other supported scaler sources [<xref ref-type="bibr" rid="B14">14</xref>]. For an examination workload, this is attractive because demand signals may appear before CPU utilization fully reflects the incoming pressure.</p>
        <p>However, event-driven scaling still depends on trigger configuration, polling behavior, cooldown periods, pod readiness, image pull time, and downstream service capacity. In a Moodle examination environment, bottlenecks may include PHP workers, database connections, shared files, cache services, ingress configuration, network throughput, and the load generator itself. These factors make empirical evaluation necessary before adopting KEDA for high-stakes assessment workloads [<xref ref-type="bibr" rid="B14">14</xref>][<xref ref-type="bibr" rid="B15">15</xref>][<xref ref-type="bibr" rid="B20">20</xref>][<xref ref-type="bibr" rid="B24">24</xref>].</p>
      </sec>
      <sec id="sec3dot4">
        <title>3.4. Peak-Load and Reliability Considerations in Examination Systems</title>
        <p>Scheduled assessment platforms experience concentrated demand because access is controlled by examination timetables and deadlines. The relevant engineering question is therefore not whether the application works under normal use, but how it behaves when many users perform similar actions within a short window. Public-facing examination services and institutional assessment platforms can both experience this pattern, even though their application workflows differ [<xref ref-type="bibr" rid="B29">29</xref>].</p>
        <p>For high-stakes examinations, error rate is a direct reliability indicator because failed requests may prevent login, page access, answer saving, or final submission. Tail latency is also important because the slowest successful requests often represent the user experience of candidates at the edge of acceptable service. The present study therefore treats latency, throughput, and error rate as complementary indicators rather than competing measures.</p>
      </sec>
    </sec>
    <sec id="sec4">
      <title>4. Methodology</title>
      <sec id="sec4dot1">
        <title>4.1. Research Design</title>
        <p>The study used a controlled experimental design. The independent variable was the scaling strategy: static scaling, Kubernetes HPA, and KEDA. The dependent variables were average response time, p95 latency, p99 latency, throughput, and error rate. The purpose was not to introduce new Moodle functionality, but to evaluate how the same Moodle examination workload behaved under each scaling configuration.</p>
        <p>The comparison used identical workload levels and the same measurement definitions across all strategies. This design supports direct comparison because changes in latency, throughput, and error rate can be interpreted against the scaling strategy rather than against different workloads or application features. Each workload level was executed four times for each scaling strategy. Reported values represent arithmetic means across repeated trials. The purpose of repetition was to reduce the impact of transient system variability and improve reliability of measurements.</p>
      </sec>
      <sec id="sec4dot2">
        <title>4.2. Experimental Environment</title>
        <p>The experiments were conducted on an on premises k3s Kubernetes cluster deployed on HPE Synergy 660 Gen10 infrastructure. The cluster consisted of one master node (16 CPU cores, 32 GB RAM), two worker nodes (each 4 CPU cores and 8 GB RAM), and a dedicated NFS storage server (4 CPU cores, 8 GB RAM). Moodle 5.2 LMS was deployed as a containerized application running on k3s version 1.34.5+k3s1, with MySQL 8.3 used as the backend database. Moodle application data were stored on a shared NFS-backed persistent volume. Prometheus and Grafana were used for monitoring, while Apache JMeter generated examination workloads which is commonly used for load, performance, and functional testing of web applications [<xref ref-type="bibr" rid="B30">30</xref>]. Moodle pods were distributed across worker nodes using Kubernetes topology-spread constraints.</p>
      </sec>
      <sec id="sec4dot3">
        <title>4.3. Scaling Configurations</title>
        <p>The static condition used two Moodle application pods and did not automatically add capacity when demand increased. This represents a common fixed-capacity deployment model in which administrators provision resources before an examination and rely on that capacity throughout the test window.</p>
        <p>The HPA configuration used Kubernetes autoscaling/v2. Moodle pods were configured with resource requests of 250m CPU and 512 MiB memory and resource limits of 1000m CPU and 1024 MiB memory. HPA was configured with a minimum replica count of 2 and a maximum replica count of 25. Scaling decisions were based on both CPU and memory utilization with target utilization thresholds of 50% for each metric. Stabilization and scaling policies were configured to prevent rapid oscillation of replica counts during workload fluctuations. KEDA was implemented using an HTTPScaledObject. Scaling decisions were based on HTTP request rate, with a target value of five requests per second, a granularity interval of 1 s, and a measurement window of 1 minute. The configuration used a scale-down period of 180 s, a minimum replica count of 0, and a maximum replica count of 25 replicas. Readiness and startup probes were inherited from the Moodle deployment and were used to ensure traffic was directed only to healthy pods.</p>
      </sec>
      <sec id="sec4dot4">
        <title>4.4. Workload Generation and Test Procedure</title>
        <p>Apache JMeter was used to emulate concurrent Moodle users. In this study, “concurrent connections” refers to the number of simultaneous JMeter virtual users (threads) executing Moodle examination transactions. The workload model represented a typical student examination journey consisting of four phases: (i) login and dashboard access, (ii) quiz start, (iii) question interaction and answer saving, and (iv) final submission. Workload levels were configured at 500, 1000, 2500, 5000, 10,000, 20,000, 30,000, 40,000, 50,000, 60,000, and 70,000 concurrent users. Ramp-up periods varied from 5 s for 500 users to 360 s for 70,000 users. Each workload level was executed four times under identical conditions, and the reported values represent the mean across repeated trials. The same HTTP connection reuse settings, request mix, and workload profile were applied to all scaling strategies to preserve comparability.</p>
      </sec>
      <sec id="sec4dot5">
        <title>4.5. Metrics and Data Analysis</title>
        <p>Average response time, p95 latency, and p99 latency were calculated using successful requests reported by Apache JMeter. Error rate was computed as the percentage of failed or timed-out requests relative to total requests (<bold>Table 1</bold>). Failed requests included HTTP errors and timeout events recorded by the load-testing framework. Consequently, latency metrics should be interpreted as the performance of successful requests, while reliability is captured separately through the error-rate metric.</p>
        <p>To support reproducibility of the results, all the deployment manifests, autoscaler configurations, workload definitions, resource requests and limits, and test parameters are provided below.</p>
        <p><bold>Table 1.</bold>Experimental variables, units, and measurement focus.</p>
        <table-wrap id="tbl1">
          <label>Table 1</label>
          <table>
            <tbody>
              <tr>
                <td>Element</td>
                <td>Description</td>
                <td>Value/setting and units</td>
              </tr>
              <tr>
                <td>Independent variable</td>
                <td>Scaling strategy</td>
                <td>Static scaling; Kubernetes HPA; KEDA</td>
              </tr>
              <tr>
                <td>Workload levels</td>
                <td>Concurrent connections</td>
                <td>500 to 70,000 concurrent connections</td>
              </tr>
              <tr>
                <td>Latency metrics</td>
                <td>Response-time indicators</td>
                <td>Average, p95, and p99 response times in milliseconds (ms)</td>
              </tr>
              <tr>
                <td>Throughput</td>
                <td>Completed request rate</td>
                <td>Requests per second (req/s)</td>
              </tr>
              <tr>
                <td>Error rate</td>
                <td>Failed or timed-out requests</td>
                <td>Percentage of total requests (%)</td>
              </tr>
              <tr>
                <td>Environment</td>
                <td>On-premises Kubernetes Moodle deployment</td>
                <td>HPE Synergy 660 Gen10 servers; k3s v1.34.5+k3s1; Moodle 5.2 LMS; MySQL 8.3</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p><bold>Kubernetes HPA deployment</bold></p>
        <p>root@master1:~/moodle# more moodle-hpa.yaml</p>
        <p>apiVersion: autoscaling/v2</p>
        <p>kind: HorizontalPodAutoscaler</p>
        <p>metadata:</p>
        <p> name: moodle-hpa</p>
        <p> namespace: moodle</p>
        <p>spec:</p>
        <p> scaleTargetRef:</p>
        <p> apiVersion: apps/v1</p>
        <p> kind: Deployment</p>
        <p> name: moodle</p>
        <p> minReplicas: 2</p>
        <p> maxReplicas: 25</p>
        <p> metrics:</p>
        <p> - type: Resource</p>
        <p> resource:</p>
        <p> name: cpu</p>
        <p> target:</p>
        <p> type: Utilization</p>
        <p> averageUtilization: 50</p>
        <p> - type: Resource</p>
        <p> resource:</p>
        <p> name: memory</p>
        <p> target:</p>
        <p> type: Utilization</p>
        <p> averageUtilization: 50</p>
        <p>root@master1:~/moodle#</p>
        <p>root@master1:~/moodle#</p>
        <p><bold>KEDA deployment</bold></p>
        <p>root@master1:~/moodle# more moodle-keda.yaml</p>
        <p>apiVersion: http.keda.sh/v1alpha1</p>
        <p>kind: HTTPScaledObject</p>
        <p>metadata:</p>
        <p> name: moodle-http-scaledobject</p>
        <p> namespace: moodle</p>
        <p>spec:</p>
        <p> hosts:</p>
        <p> - mydomain.domain.com</p>
        <p> scaleTargetRef:</p>
        <p> apiVersion: apps/v1</p>
        <p> kind: Deployment</p>
        <p> name: moodle</p>
        <p> service: moodle</p>
        <p> port: 80</p>
        <p> replicas:</p>
        <p> min: 0</p>
        <p> max: 25</p>
        <p> scalingMetric:</p>
        <p> requestRate:</p>
        <p> targetValue: 5</p>
        <p> granularity: 1s</p>
        <p> window: 1m</p>
        <p> scaledownPeriod: 180</p>
        <p>root@master1:~/moodle#</p>
        <p><bold>JMeter Workload timing</bold></p>
        <p><bold>Table 2.</bold>JMeter workload timings.</p>
        <table-wrap id="tbl2">
          <label>Table 2</label>
          <table>
            <tbody>
              <tr>
                <td>Concurrent connections</td>
                <td>Time (s)</td>
              </tr>
              <tr>
                <td>500</td>
                <td>5</td>
              </tr>
              <tr>
                <td>1000</td>
                <td>10</td>
              </tr>
              <tr>
                <td>2500</td>
                <td>15</td>
              </tr>
              <tr>
                <td>5000</td>
                <td>30</td>
              </tr>
              <tr>
                <td>10,000</td>
                <td>60</td>
              </tr>
              <tr>
                <td>20,000</td>
                <td>120</td>
              </tr>
              <tr>
                <td>30,000</td>
                <td>150</td>
              </tr>
              <tr>
                <td>40,000</td>
                <td>200</td>
              </tr>
              <tr>
                <td>50,000</td>
                <td>250</td>
              </tr>
              <tr>
                <td>60,000</td>
                <td>300</td>
              </tr>
              <tr>
                <td>70,000</td>
                <td>360</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
      </sec>
    </sec>
    <sec id="sec5">
      <title>5. Results</title>
      <p>The results are presented as a continuous full-range analysis from 500 to 70,000 concurrent connections (<bold>Table 2</bold>). </p>
      <sec id="sec5dot1">
        <title>5.1. Average Response Time</title>
        <p>At 500 concurrent connections, all strategies were relatively close: static scaling recorded 328 ms, HPA 283 ms, and KEDA 389 ms (<bold>Table 3</bold>). The first major separation occurred at 1000 concurrent connections, where static scaling rose to 5419 ms while HPA and KEDA remained at 253 ms and 347 ms, respectively. Static scaling then reached 10,347 ms at 2500 concurrent connections, showing that fixed capacity began to queue requests early in the workload curve.</p>
        <p><bold>Table 3</bold><bold>.</bold>Average response time by workload (ms).</p>
        <table-wrap id="tbl3">
          <label>Table 3</label>
          <table>
            <tbody>
              <tr>
                <td>Concurrent connections</td>
                <td>Static scaling (ms)</td>
                <td>HPA (ms)</td>
                <td>KEDA (ms)</td>
              </tr>
              <tr>
                <td>500</td>
                <td>328</td>
                <td>283</td>
                <td>389</td>
              </tr>
              <tr>
                <td>1000</td>
                <td>5419</td>
                <td>253</td>
                <td>347</td>
              </tr>
              <tr>
                <td>2500</td>
                <td>10,347</td>
                <td>225</td>
                <td>338</td>
              </tr>
              <tr>
                <td>5000</td>
                <td>7085</td>
                <td>275</td>
                <td>252</td>
              </tr>
              <tr>
                <td>10,000</td>
                <td>6496</td>
                <td>2476</td>
                <td>412</td>
              </tr>
              <tr>
                <td>20,000</td>
                <td>4277</td>
                <td>1964</td>
                <td>791</td>
              </tr>
              <tr>
                <td>30,000</td>
                <td>3112</td>
                <td>2127</td>
                <td>941</td>
              </tr>
              <tr>
                <td>40,000</td>
                <td>3159</td>
                <td>2041</td>
                <td>1419</td>
              </tr>
              <tr>
                <td>50,000</td>
                <td>2788</td>
                <td>2071</td>
                <td>1576</td>
              </tr>
              <tr>
                <td>60,000</td>
                <td>3133</td>
                <td>2119</td>
                <td>1776</td>
              </tr>
              <tr>
                <td>70,000</td>
                <td>2655</td>
                <td>2122</td>
                <td>1604</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p>HPA maintained low average response time through 5000 concurrent connections, reaching 275 ms at that point, but rose to 2476 ms at 10,000 concurrent connections. KEDA recorded 252 ms at 5000 concurrent connections, 412 ms at 10,000 concurrent connections, and 1604 ms at 70,000 concurrent connections (<xref ref-type="fig" rid="fig1">Figure 1</xref>). These values show that KEDA delivered the fastest average response time among successful requests under several high-load conditions. However, this must be read together with the error-rate results because a fast average response time is not sufficient if many requests fail.</p>
      </sec>
      <sec id="sec5dot2">
        <title>5.2. Tail Latency</title>
        <p>The p95 and p99 results show the slower end of successful request performance (<xref ref-type="fig" rid="fig2">Figure 2</xref> &amp; <xref ref-type="fig" rid="fig3">Figure 3</xref>). Static scaling deteriorated immediately after the first workload increase: p95 latency rose from 741 ms at 500 concurrent connections to 10,689 ms at 1000 concurrent connections and 16,803 ms at 2500 concurrent connections. It remained above 10,000 ms across most of the upper range, demonstrating persistent tail-latency instability.</p>
        <fig id="fig1">
          <label>Figure 1</label>
          <graphic xlink:href="https://html.scirp.org/file/1733660-rId13.jpeg?20261022014738" />
        </fig>
        <p><bold>Figure 1.</bold> Average response time for static scaling, HPA, and KEDA across workloads.</p>
        <fig id="fig2">
          <label>Figure 2</label>
          <graphic xlink:href="https://html.scirp.org/file/1733660-rId14.jpeg?20261022014738" />
        </fig>
        <p><bold>Figure 2</bold><bold>.</bold> 95th percentile latency across workloads.</p>
        <fig id="fig3">
          <label>Figure 3</label>
          <graphic xlink:href="https://html.scirp.org/file/1733660-rId15.jpeg?20261022014738" />
        </fig>
        <p><bold>Figure 3</bold><bold>.</bold> 99th percentile latency across workloads.</p>
        <p>HPA performed strongly at lower workloads but increased sharply at higher loads. At 10,000 concurrent connections, HPA reached 7987 ms on p95 and 10,005 ms on p99, whereas KEDA recorded 939 ms and 1287 ms, respectively (<bold>Table 4</bold> &amp; <bold>Table 5</bold>). From 20,000 to 70,000 concurrent connections, KEDA kept successful tail requests faster than HPA. Nevertheless, the lower KEDA tail latency should not be interpreted alone because its error rate was substantially higher than HPA’s at the same high-load points.</p>
        <p><bold>Table 4</bold><bold>.</bold>95th percentile latency by workload (ms).</p>
        <table-wrap id="tbl4">
          <label>Table 4</label>
          <table>
            <tbody>
              <tr>
                <td>Concurrent connections</td>
                <td>Static scaling p95 (ms)</td>
                <td>HPA p95 (ms)</td>
                <td>KEDA p95 (ms)</td>
              </tr>
              <tr>
                <td>500</td>
                <td>741</td>
                <td>888</td>
                <td>1152</td>
              </tr>
              <tr>
                <td>1000</td>
                <td>10,689</td>
                <td>678</td>
                <td>755</td>
              </tr>
              <tr>
                <td>2500</td>
                <td>16,803</td>
                <td>545</td>
                <td>769</td>
              </tr>
              <tr>
                <td>5000</td>
                <td>16,011</td>
                <td>640</td>
                <td>708</td>
              </tr>
              <tr>
                <td>10,000</td>
                <td>14,716</td>
                <td>7987</td>
                <td>939</td>
              </tr>
              <tr>
                <td>20,000</td>
                <td>13,587</td>
                <td>7243</td>
                <td>3001</td>
              </tr>
              <tr>
                <td>30,000</td>
                <td>11,320</td>
                <td>7040</td>
                <td>3347</td>
              </tr>
              <tr>
                <td>40,000</td>
                <td>10,313</td>
                <td>5856</td>
                <td>4235</td>
              </tr>
              <tr>
                <td>50,000</td>
                <td>10,051</td>
                <td>5912</td>
                <td>4843</td>
              </tr>
              <tr>
                <td>60,000</td>
                <td>10,276</td>
                <td>5587</td>
                <td>5447</td>
              </tr>
              <tr>
                <td>70,000</td>
                <td>10,005</td>
                <td>5837</td>
                <td>4639</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <p><bold>Table 5</bold><bold>.</bold>99th percentile latency by workload (ms).</p>
        <table-wrap id="tbl5">
          <label>Table 5</label>
          <table>
            <tbody>
              <tr>
                <td>Concurrent connections</td>
                <td>Static scaling p99 (ms)</td>
                <td>HPA p99 (ms)</td>
                <td>KEDA p99 (ms)</td>
              </tr>
              <tr>
                <td>500</td>
                <td>741</td>
                <td>1501</td>
                <td>1634</td>
              </tr>
              <tr>
                <td>1000</td>
                <td>10,689</td>
                <td>758</td>
                <td>966</td>
              </tr>
              <tr>
                <td>2500</td>
                <td>16,803</td>
                <td>850</td>
                <td>1669</td>
              </tr>
              <tr>
                <td>5000</td>
                <td>16,011</td>
                <td>2761</td>
                <td>828</td>
              </tr>
              <tr>
                <td>10,000</td>
                <td>14,716</td>
                <td>10,005</td>
                <td>1287</td>
              </tr>
              <tr>
                <td>20,000</td>
                <td>13,587</td>
                <td>10,004</td>
                <td>3498</td>
              </tr>
              <tr>
                <td>30,000</td>
                <td>11,320</td>
                <td>9491</td>
                <td>4897</td>
              </tr>
              <tr>
                <td>40,000</td>
                <td>10,313</td>
                <td>7970</td>
                <td>5540</td>
              </tr>
              <tr>
                <td>50,000</td>
                <td>10,051</td>
                <td>8609</td>
                <td>6258</td>
              </tr>
              <tr>
                <td>60,000</td>
                <td>10,276</td>
                <td>9957</td>
                <td>6598</td>
              </tr>
              <tr>
                <td>70,000</td>
                <td>10,005</td>
                <td>9739</td>
                <td>6489</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
      </sec>
      <sec id="sec5dot3">
        <title>5.3. Throughput</title>
        <p>Throughput increased for all three strategies as the workload increased, but autoscaling strategies separated from static scaling early. At 1000 concurrent connections, static scaling reached 41.99 req/s, compared with 65.21 req/s for HPA and 64.27 req/s for KEDA (<bold>Table 6</bold>). At larger workloads, KEDA recorded the highest throughput at most points, including 323.17 req/s at 10,000 concurrent connections, 756.46 req/s at 40,000 concurrent connections, and 777.74 req/s at 60,000 concurrent connections (<xref ref-type="fig" rid="fig4">Figure 4</xref>).</p>
        <p><bold>Table 6</bold><bold>.</bold>Throughput by workload (req/s).</p>
        <table-wrap id="tbl6">
          <label>Table 6</label>
          <table>
            <tbody>
              <tr>
                <td>Concurrent connections</td>
                <td>Static scaling (req/s)</td>
                <td>HPA (req/s)</td>
                <td>KEDA (req/s)</td>
              </tr>
              <tr>
                <td>500</td>
                <td>32.63</td>
                <td>32.53</td>
                <td>32.08</td>
              </tr>
              <tr>
                <td>1000</td>
                <td>41.99</td>
                <td>65.21</td>
                <td>64.27</td>
              </tr>
              <tr>
                <td>2500</td>
                <td>89.76</td>
                <td>157.54</td>
                <td>161.12</td>
              </tr>
              <tr>
                <td>5000</td>
                <td>120.39</td>
                <td>160.03</td>
                <td>163.93</td>
              </tr>
              <tr>
                <td>10,000</td>
                <td>287.51</td>
                <td>299.02</td>
                <td>323.17</td>
              </tr>
              <tr>
                <td>20,000</td>
                <td>423.30</td>
                <td>478.72</td>
                <td>484.02</td>
              </tr>
              <tr>
                <td>30,000</td>
                <td>396.07</td>
                <td>489.26</td>
                <td>484.34</td>
              </tr>
              <tr>
                <td>40,000</td>
                <td>643.14</td>
                <td>714.55</td>
                <td>756.46</td>
              </tr>
              <tr>
                <td>50,000</td>
                <td>736.54</td>
                <td>746.44</td>
                <td>773.78</td>
              </tr>
              <tr>
                <td>60,000</td>
                <td>692.38</td>
                <td>757.89</td>
                <td>777.74</td>
              </tr>
              <tr>
                <td>70,000</td>
                <td>733.19</td>
                <td>779.23</td>
                <td>771.16</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <fig id="fig4">
          <label>Figure 4</label>
          <graphic xlink:href="https://html.scirp.org/file/1733660-rId16.jpeg?20261022014739" />
        </fig>
        <p><bold>Figure 4.</bold> Throughput for static scaling, HPA, and KEDA across workloads.</p>
        <p>Throughput must be interpreted with error rate because a system can appear to process many requests per second while still failing a large proportion of total attempts. For example, KEDA produced the highest throughput at 10,000 concurrent connections, but its error rate at the same point was 93.725%. This means that its throughput advantage reflected the rate of completed requests among a workload in which many requests failed.</p>
      </sec>
      <sec id="sec5dot4">
        <title>5.4. Error Rate</title>
        <p>Error rate is the most important metric for examination continuity because failed requests can prevent candidates from logging in, loading pages, saving answers, or submitting work (<xref ref-type="fig" rid="fig5">Figure 5</xref>). Static scaling recorded 0% error at 500 concurrent connections, 13.775% at 1000 concurrent connections, 81% at 2500 concurrent connections, and 92% at 5000 concurrent connections. From 10,000 to 70,000 concurrent connections, its error rate remained between 97.95% and 99.7%, making it unsuitable for the upper workload range (<bold>Table 7</bold>).</p>
        <p>Across the four experimental trials, HPA consistently produced lower observed error rates than KEDA and static scaling under the tested workload conditions. It maintained 0% error from 500 through 5000 concurrent connections. At 10,000 concurrent connections, HPA’s error rate increased to 61.675%, which is severe, but it was still lower than KEDA’s 93.725% and static scaling’s 98.4%. HPA remained the lowest-error strategy at every larger workload. KEDA performed well at the beginning of the curve, but its error rate rose to 14.5% at 2500 concurrent connections, 29.575% at 5000 concurrent connections, and 93.725% at 10,000 concurrent connections.</p>
        <p><bold>Table 7</bold><bold>.</bold>Error rate by workload (%).</p>
        <table-wrap id="tbl7">
          <label>Table 7</label>
          <table>
            <tbody>
              <tr>
                <td>Concurrent connections</td>
                <td>Static scaling (%)</td>
                <td>HPA (%)</td>
                <td>KEDA (%)</td>
              </tr>
              <tr>
                <td>500</td>
                <td>0</td>
                <td>0</td>
                <td>0.50</td>
              </tr>
              <tr>
                <td>1000</td>
                <td>13.78</td>
                <td>0</td>
                <td>0.15</td>
              </tr>
              <tr>
                <td>2500</td>
                <td>81</td>
                <td>0</td>
                <td>14.50</td>
              </tr>
              <tr>
                <td>5000</td>
                <td>92</td>
                <td>0</td>
                <td>29.57</td>
              </tr>
              <tr>
                <td>10,000</td>
                <td>98.40</td>
                <td>61.67</td>
                <td>93.72</td>
              </tr>
              <tr>
                <td>20,000</td>
                <td>98.58</td>
                <td>83.62</td>
                <td>98.15</td>
              </tr>
              <tr>
                <td>30,000</td>
                <td>98.75</td>
                <td>87.03</td>
                <td>97.38</td>
              </tr>
              <tr>
                <td>40,000</td>
                <td>99.60</td>
                <td>91.28</td>
                <td>99.40</td>
              </tr>
              <tr>
                <td>50,000</td>
                <td>97.95</td>
                <td>94.55</td>
                <td>99.53</td>
              </tr>
              <tr>
                <td>60,000</td>
                <td>99.70</td>
                <td>93.88</td>
                <td>99.28</td>
              </tr>
              <tr>
                <td>70,000</td>
                <td>98.78</td>
                <td>96.45</td>
                <td>99.72</td>
              </tr>
            </tbody>
          </table>
        </table-wrap>
        <fig id="fig5">
          <label>Figure 5</label>
          <graphic xlink:href="https://html.scirp.org/file/1733660-rId17.jpeg?20261022014739" />
        </fig>
        <p><bold>Figure 5</bold><bold>.</bold> Error rate for static scaling, HPA, and KEDA across workloads.</p>
        <p>A sample interpretation illustrates the trade-off. At 10,000 concurrent connections, KEDA had a much lower average response time than HPA, 412 ms compared with 2476 ms. If response time alone were considered, KEDA would appear superior. However, KEDA failed 93.725% of requests at that workload, while HPA failed 61.675%. Therefore, HPA served a larger share of the workload successfully, even though the successful HPA requests were slower. In an examination setting, that distinction is critical because a slower successful submission is preferable to a fast failure.</p>
      </sec>
    </sec>
    <sec id="sec6">
      <title>6. Discussion</title>
      <p>The results clarify the practical difference between fixed provisioning and autoscaling. Static scaling failed not only at extreme load but also at relatively early points in the workload curve. In an examination setting, this would correspond to delayed logins, stalled page loads, failed quiz access, or failed submissions. This supports the performance-engineering principle that systems must be evaluated under representative workload and metric conditions rather than under ordinary functional use alone [<xref ref-type="bibr" rid="B25">25</xref>][<xref ref-type="bibr" rid="B26">26</xref>][<xref ref-type="bibr" rid="B30">30</xref>].</p>
      <p>HPA is the most defensible option when the objective is continuity of service. Its zero-error performance up to 5,000 concurrent connections and lowest error rate at every larger workload show that resource-based autoscaling protected a larger share of requests than KEDA in this experiment. The trade-off is that HPA’s successful requests became slower under high load, particularly in p95 and p99 latency after 10,000 concurrent connections. This aligns with the known behavior of reactive autoscaling: it can improve resilience, but it may still react after workload pressure has already accumulated [<xref ref-type="bibr" rid="B12">12</xref>][<xref ref-type="bibr" rid="B13">13</xref>][<xref ref-type="bibr" rid="B18">18</xref>]-[<xref ref-type="bibr" rid="B23">23</xref>].</p>
      <p>KEDA should not be interpreted as unsuccessful overall. It demonstrated strong responsiveness among requests that were completed, especially after the workload entered the high-load region. Its lower high-load latency and slightly stronger throughput suggest that event-driven scaling can keep successful requests efficient. The problem is that KEDA’s reliability deteriorated earlier in this configuration. Possible causes include trigger thresholds, polling interval, cooldown settings, pod startup time, readiness behavior, database saturation, ingress limits, or another downstream bottleneck. These factors require further measurement rather than assumption because KEDA scaling behavior depends directly on event sources, external metrics, and scaler settings [<xref ref-type="bibr" rid="B14">14</xref>][<xref ref-type="bibr" rid="B15">15</xref>].</p>
      <p>For institutional deployment, the choice should be guided by service objectives. If the goal is to maximize the probability that candidates can complete examination actions, HPA is the safer option in this dataset. If the goal is to maximize responsiveness among successful requests and throughput, KEDA becomes attractive, but only with careful tuning and a non-zero warm baseline. A hybrid design that combines HPA stability with KEDA demand signals is a strong candidate for future evaluation, alongside predictive and SLO-aware autoscaling approaches [<xref ref-type="bibr" rid="B16">16</xref>][<xref ref-type="bibr" rid="B17">17</xref>][<xref ref-type="bibr" rid="B20">20</xref>]-[<xref ref-type="bibr" rid="B23">23</xref>].</p>
    </sec>
    <sec id="sec7">
      <title>7. Threats to Validity</title>
      <p>Internal validity is limited by the specific Moodle deployment, Kubernetes environment, database configuration, network, and autoscaler settings used in the experiment. Any unobserved bottleneck, including database connection limits, disk input/output (I/O), PHP worker limits, ingress configuration, shared storage behavior, or JMeter generator limits, could affect the measured results.</p>
      <p>Construct validity is limited by the workload configuration from 500 to 70,000 concurrent connections and by the selected metrics. Although average response time, p95, p99, throughput, and error rate are appropriate for this study, additional metrics such as pod startup time, CPU utilization, memory utilization, database wait time, queue length, and autoscaler event timelines would strengthen causal interpretation.</p>
      <p>External validity is limited because the experiment used an on-premises Kubernetes cluster. Results may differ in public cloud environments, with different pod startup times, managed load balancers, storage systems, database architectures, network latency, or cluster autoscaling behavior. Conclusion validity is limited because the study compares the observed configurations of static scaling, HPA, and KEDA; it does not prove that HPA is always superior to KEDA under all trigger settings or infrastructure designs. </p>
      <p>Although four repeated trials were conducted for each workload level, the current study reports mean values and do not include formal confidence intervals or hypothesis-testing statistics. Consequently, the findings should be interpreted as comparative experimental observations within the evaluated environment rather than evidence of universal superiority of one autoscaling strategy over another.</p>
    </sec>
    <sec id="sec8">
      <title>8. Recommendations</title>
      <p>Institutions should avoid relying on static Moodle deployments for high-stakes online examinations with synchronized access patterns. Static capacity may be sufficient for ordinary LMS use, but this experiment shows that it can fail early when many users access the examination workflow at the same time.</p>
      <p>HPA should be considered the baseline autoscaling strategy where examination continuity is the primary objective. KEDA should be evaluated through institution-specific load testing before production use because it may require lower trigger thresholds, shorter polling intervals, adjusted cooldown behavior, pre-warmed minimum replicas, readiness probes, database-side capacity tuning, and careful ingress configuration before it can combine its responsiveness advantage with acceptable reliability [<xref ref-type="bibr" rid="B12">12</xref>]-[<xref ref-type="bibr" rid="B15">15</xref>][<xref ref-type="bibr" rid="B24">24</xref>].</p>
      <p>Load testing should be treated as a pre-examination operational requirement. Raw JMeter logs, Kubernetes manifests, autoscaler events, resource metrics, database metrics, and monitoring dashboards should be archived for reproducibility. Future work should evaluate hybrid HPA-KEDA autoscaling, predictive pre-scaling before scheduled examination starts, database and cache scaling, and repeated trials across public cloud and on-premises environments. More advanced adaptive approaches, including SLO-aware autoscaling, should also be compared against practical Kubernetes autoscaling patterns in education workloads [<xref ref-type="bibr" rid="B16">16</xref>][<xref ref-type="bibr" rid="B17">17</xref>][<xref ref-type="bibr" rid="B20">20</xref>]-[<xref ref-type="bibr" rid="B23">23</xref>].</p>
    </sec>
    <sec id="sec9">
      <title>9. Conclusion</title>
      <p>This study evaluated static scaling, Kubernetes HPA, and KEDA for a Moodle-based online examination deployment. Static scaling broke down early in both latency and reliability, making it unsuitable for demanding synchronized examination workloads. HPA provided the strongest reliability profile and demonstrated the most favorable reliability characteristics within the tested environment and configuration. KEDA provided stronger responsiveness and throughput among successful requests at several high-load points, but its error rate increased earlier and more sharply than HPA’s in this configuration. The central finding is therefore not that one autoscaler is universally best, but that autoscaling strategy must match the service objective and must be validated under realistic examination load before production use.</p>
    </sec>
    <sec id="sec10">
      <title>Author Contributions</title>
      <p>Robert Achang’a conceived the research topic, developed the study content, designed the experimental setup, and carried out the experiments. Andrew Kahonge contributed to the design and execution of the workload tests, analysis of the experimental results, and overall research supervision. Elisha Abade provided guidance on the research methodology and contributed to the overall supervision of the study. </p>
    </sec>
  </body>
  <back>
    <ref-list>
      <title>References</title>
      <ref id="B1">
        <label>1.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Gikandi, J.W., Morrow, D. and Davis, N.E. (2011) Online Formative Assessment in Higher Education: A Review of the Literature. <italic>Computers &amp; Education</italic>, 57, 2333-2351. https://doi.org/10.1016/j.compedu.2011.06.004 <pub-id pub-id-type="doi">10.1016/j.compedu.2011.06.004</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1016/j.compedu.2011.06.004">https://doi.org/10.1016/j.compedu.2011.06.004</ext-link></mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Gikandi, J.W.</string-name>
              <string-name>Morrow, D.</string-name>
              <string-name>Davis, N.E.</string-name>
            </person-group>
            <year>2011</year>
            <article-title>Online Formative Assessment in Higher Education: A Review of the Literature</article-title>
            <source>Computers &amp; Education</source>
            <volume>57</volume>
            <pub-id pub-id-type="doi">10.1016/j.compedu.2011.06.004</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B2">
        <label>2.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Siemens, G. (2013) Learning Analytics: The Emergence of a Discipline. <italic>American Behavioral Scientist</italic>, 57, 1380-1400. https://doi.org/10.1177/0002764213498851 <pub-id pub-id-type="doi">10.1177/0002764213498851</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1177/0002764213498851">https://doi.org/10.1177/0002764213498851</ext-link></mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Siemens, G.</string-name>
            </person-group>
            <year>2013</year>
            <article-title>Learning Analytics: The Emergence of a Discipline</article-title>
            <source>American Behavioral Scientist</source>
            <volume>57</volume>
            <pub-id pub-id-type="doi">10.1177/0002764213498851</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B3">
        <label>3.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Ifenthaler, D. and Yau, J.Y. (2020) Utilising Learning Analytics to Support Study Success in Higher Education: A Systematic Review. <italic>Educational Technology Research and Development</italic>, 68, 1961-1990. https://doi.org/10.1007/s11423-020-09788-z <pub-id pub-id-type="doi">10.1007/s11423-020-09788-z</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1007/s11423-020-09788-z">https://doi.org/10.1007/s11423-020-09788-z</ext-link></mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Ifenthaler, D.</string-name>
              <string-name>Yau, J.Y.</string-name>
            </person-group>
            <year>2020</year>
            <article-title>Utilising Learning Analytics to Support Study Success in Higher Education: A Systematic Review</article-title>
            <source>Educational Technology Research and Development</source>
            <volume>68</volume>
            <pub-id pub-id-type="doi">10.1007/s11423-020-09788-z</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B4">
        <label>4.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Dougiamas, M. and Taylor, P. (2003) Moodle: Using Learning Communities to Create an Open Source Course Management System. ED-MEDIA 2003—World Conference Educational Multimedia, Hypermedia &amp; Telecommunications, Honolulu, 23-287 June 2003, 171-178.</mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Dougiamas, M.</string-name>
              <string-name>Taylor, P.</string-name>
              <string-name>Multimedia, H</string-name>
              <string-name>Telecommunications, H</string-name>
            </person-group>
            <year>2003</year>
            <article-title>Moodle: Using Learning Communities to Create an Open Source Course Management System</article-title>
            <source>ED-MEDIA 2003—World Conference Educational Multimedia</source>
            <volume>23</volume>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B5">
        <label>5.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">Moodle (2026) Moodle Documentation. https://docs.moodle.org/</mixed-citation>
          <element-citation publication-type="web">
            <year>2026</year>
            <article-title>Moodle Documentation</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B6">
        <label>6.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Tarus, J.K., Gichoya, D. and Muumbo, A. (2015) Challenges of Implementing E-Learning in Kenya: A Case of Kenyan Public Universities. <italic>The</italic><italic>International Review</italic><italic>of Research in Open and Distributed Learning</italic>, 16, 120-141. https://doi.org/10.19173/irrodl.v16i1.1816 <pub-id pub-id-type="doi">10.19173/irrodl.v16i1.1816</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.19173/irrodl.v16i1.1816">https://doi.org/10.19173/irrodl.v16i1.1816</ext-link></mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Tarus, J.K.</string-name>
              <string-name>Gichoya, D.</string-name>
              <string-name>Muumbo, A.</string-name>
            </person-group>
            <year>2015</year>
            <article-title>Challenges of Implementing E-Learning in Kenya: A Case of Kenyan Public Universities</article-title>
            <source>The International Review of Research in Open and Distributed Learning</source>
            <volume>16</volume>
            <pub-id pub-id-type="doi">10.19173/irrodl.v16i1.1816</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B7">
        <label>7.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Kibuku, R.N., Ochieng, P.D.O. and Wausi, P.A.N. (2020) E-Learning Challenges Faced by Universities in Kenya: A Literature Review. <italic>Electronic Journal of</italic><italic>e</italic><italic>-Learning</italic>, 18, 150-161. https://doi.org/10.34190/ejel.20.18.2.004 <pub-id pub-id-type="doi">10.34190/ejel.20.18.2.004</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.34190/ejel.20.18.2.004">https://doi.org/10.34190/ejel.20.18.2.004</ext-link></mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Kibuku, R.N.</string-name>
              <string-name>Ochieng, P.D.O.</string-name>
              <string-name>Wausi, P.A.N.</string-name>
            </person-group>
            <year>2020</year>
            <article-title>E-Learning Challenges Faced by Universities in Kenya: A Literature Review</article-title>
            <source>Electronic Journal of e-Learning</source>
            <volume>18</volume>
            <pub-id pub-id-type="doi">10.34190/ejel.20.18.2.004</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B8">
        <label>8.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Nyerere, J. (2016) Delivery of Open, Distance, and E-Learning in Kenya. <italic>International Journal of Advanced Research in Education &amp; Technology</italic>, 3, 167-171.</mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Nyerere, J.</string-name>
              <string-name>Open, D</string-name>
            </person-group>
            <year>2016</year>
            <article-title>Delivery of Open, Distance, and E-Learning in Kenya</article-title>
            <source>International Journal of Advanced Research in Education &amp; Technology</source>
            <volume>3</volume>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B9">
        <label>9.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Deya, F. (2025) Accessing Online and Remote Learning Platforms in Kenyan Remote Areas during COVID-19 Pandemic. David Publisher.</mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Deya, F.</string-name>
            </person-group>
            <year>2025</year>
            <article-title>Accessing Online and Remote Learning Platforms in Kenyan Remote Areas during COVID-19 Pandemic</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B10">
        <label>10.</label>
        <citation-alternatives>
          <mixed-citation publication-type="book">Burns, B., Beda, J., Hightower, K. and Evenson, L. (2019) Kubernetes: Up and Running. 2nd Edition, O’Reilly Media.</mixed-citation>
          <element-citation publication-type="book">
            <person-group person-group-type="author">
              <string-name>Burns, B.</string-name>
              <string-name>Beda, J.</string-name>
              <string-name>Hightower, K.</string-name>
              <string-name>Evenson, L.</string-name>
              <string-name>Edition, O</string-name>
            </person-group>
            <year>2019</year>
            <article-title>Kubernetes: Up and Running</article-title>
            <source>2nd Edition</source>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B11">
        <label>11.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">Cloud Native Computing Foundation (2026) Kubernetes Documentation. https://kubernetes.io/docs/</mixed-citation>
          <element-citation publication-type="web">
            <year>2026</year>
            <article-title>Kubernetes Documentation</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B12">
        <label>12.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">Kubernetes (2026) Horizontal Pod Autoscaling. https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/</mixed-citation>
          <element-citation publication-type="web">
            <year>2026</year>
            <article-title>Horizontal Pod Autoscaling</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B13">
        <label>13.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">Kubernetes (2026) Resource Metrics Pipeline. https://kubernetes.io/docs/tasks/debug/debug-cluster/resource-metrics-pipeline/</mixed-citation>
          <element-citation publication-type="web">
            <year>2026</year>
            <article-title>Resource Metrics Pipeline</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B14">
        <label>14.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">KEDA (2026) Kubernetes Event-Driven Autoscaling Documentation. https://keda.sh/docs/</mixed-citation>
          <element-citation publication-type="web">
            <year>2026</year>
            <article-title>Kubernetes Event-Driven Autoscaling Documentation</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B15">
        <label>15.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">Red Hat (2019) Celebrating KEDA 1.0: Providing an Event-Driven Scale Capability for Any Container Workload. https://www.redhat.com/</mixed-citation>
          <element-citation publication-type="web">
            <year>2019</year>
            <article-title>Celebrating KEDA 1</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B16">
        <label>16.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Mayerhofer, R., Morichetta, A., Furutanpey, A. and Dustdar, S. (2025) HPAQT: Adaptive and Interpretable High-Level SLO-Aware Autoscaling with Reinforcement Learning. <italic>Proceedings of the</italic> 18 <italic>th IEEE</italic>/ <italic>ACM International Conference on Utility and Cloud Computing</italic>, France, 1-4 December 2025, 1-9. https://doi.org/10.1145/3773274.3774274 <pub-id pub-id-type="doi">10.1145/3773274.3774274</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/3773274.3774274">https://doi.org/10.1145/3773274.3774274</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Mayerhofer, R.</string-name>
              <string-name>Morichetta, A.</string-name>
              <string-name>Furutanpey, A.</string-name>
              <string-name>Dustdar, S.</string-name>
              <string-name>Computing, F</string-name>
            </person-group>
            <year>2025</year>
            <article-title>HPAQT: Adaptive and Interpretable High-Level SLO-Aware Autoscaling with Reinforcement Learning</article-title>
            <source>Proceedings of the 18th IEEE/ACM International Conference on Utility and Cloud Computing</source>
            <volume>1</volume>
            <pub-id pub-id-type="doi">10.1145/3773274.3774274</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B17">
        <label>17.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Rodriguez, M.A. and Buyya, R. (2018) Container‐Based Cluster Orchestration Systems: A Taxonomy and Future Directions. <italic>Software</italic>: <italic>Practice and Experience</italic>, 49, 698-719. https://doi.org/10.1002/spe.2660 <pub-id pub-id-type="doi">10.1002/spe.2660</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1002/spe.2660">https://doi.org/10.1002/spe.2660</ext-link></mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Rodriguez, M.A.</string-name>
              <string-name>Buyya, R.</string-name>
            </person-group>
            <year>2018</year>
            <article-title>Container‐Based Cluster Orchestration Systems: A Taxonomy and Future Directions</article-title>
            <source>Software: Practice and Experience</source>
            <volume>49</volume>
            <pub-id pub-id-type="doi">10.1002/spe.2660</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B18">
        <label>18.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Lorido-Botran, T., Miguel-Alonso, J. and Lozano, J.A. (2014) A Review of Auto-Scaling Techniques for Elastic Applications in Cloud Environments. <italic>Journal of Grid Computing</italic>, 12, 559-592. https://doi.org/10.1007/s10723-014-9314-7 <pub-id pub-id-type="doi">10.1007/s10723-014-9314-7</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1007/s10723-014-9314-7">https://doi.org/10.1007/s10723-014-9314-7</ext-link></mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Lorido-Botran, T.</string-name>
              <string-name>Miguel-Alonso, J.</string-name>
              <string-name>Lozano, J.A.</string-name>
            </person-group>
            <year>2014</year>
            <article-title>A Review of Auto-Scaling Techniques for Elastic Applications in Cloud Environments</article-title>
            <source>Journal of Grid Computing</source>
            <volume>12</volume>
            <pub-id pub-id-type="doi">10.1007/s10723-014-9314-7</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B19">
        <label>19.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Ali-Eldin, A., Kihl, M., Tordsson, J. and Elmroth, E. (2012) Efficient Provisioning of Bursty Scientific Workloads on the Cloud Using Adaptive Elasticity Control. <italic>Proceedings of the</italic>3 <italic>rd</italic><italic>Workshop</italic><italic>on Scientific Cloud Computing</italic>, Delft, 18 June 2012, 31-40. https://doi.org/10.1145/2287036.2287044 <pub-id pub-id-type="doi">10.1145/2287036.2287044</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/2287036.2287044">https://doi.org/10.1145/2287036.2287044</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Ali-Eldin, A.</string-name>
              <string-name>Kihl, M.</string-name>
              <string-name>Tordsson, J.</string-name>
              <string-name>Elmroth, E.</string-name>
              <string-name>Computing, D</string-name>
            </person-group>
            <year>2012</year>
            <article-title>Efficient Provisioning of Bursty Scientific Workloads on the Cloud Using Adaptive Elasticity Control</article-title>
            <source>Proceedings of the 3rd Workshop on Scientific Cloud Computing</source>
            <volume>18</volume>
            <pub-id pub-id-type="doi">10.1145/2287036.2287044</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B20">
        <label>20.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Mao, M. and Humphrey, M. (2011) Auto-Scaling to Minimize Cost and Meet Application Deadlines in Cloud Workflows. <italic>Proceedings of</italic> 2011 <italic>International Conference for High Performance Computing</italic>, <italic>Networking</italic>, <italic>Storage and Analysis</italic>, Seattle, 12-18 November 2011, 1-12. https://doi.org/10.1145/2063384.2063449 <pub-id pub-id-type="doi">10.1145/2063384.2063449</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/2063384.2063449">https://doi.org/10.1145/2063384.2063449</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Mao, M.</string-name>
              <string-name>Humphrey, M.</string-name>
              <string-name>Computing, N</string-name>
              <string-name>Analysis, S</string-name>
            </person-group>
            <year>2011</year>
            <article-title>Auto-Scaling to Minimize Cost and Meet Application Deadlines in Cloud Workflows</article-title>
            <source>Proceedings of 2011 International Conference for High Performance Computing</source>
            <volume>12</volume>
            <pub-id pub-id-type="doi">10.1145/2063384.2063449</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B21">
        <label>21.</label>
        <citation-alternatives>
          <mixed-citation publication-type="journal">Taherizadeh, S. and Stankovski, V. (2018) Dynamic Multi-Level Auto-Scaling Rules for Containerized Applications. <italic>The</italic><italic>Computer Journal</italic>, 62, 174-197. https://doi.org/10.1093/comjnl/bxy043 <pub-id pub-id-type="doi">10.1093/comjnl/bxy043</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1093/comjnl/bxy043">https://doi.org/10.1093/comjnl/bxy043</ext-link></mixed-citation>
          <element-citation publication-type="journal">
            <person-group person-group-type="author">
              <string-name>Taherizadeh, S.</string-name>
              <string-name>Stankovski, V.</string-name>
            </person-group>
            <year>2018</year>
            <article-title>Dynamic Multi-Level Auto-Scaling Rules for Containerized Applications</article-title>
            <source>The Computer Journal</source>
            <volume>62</volume>
            <pub-id pub-id-type="doi">10.1093/comjnl/bxy043</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B22">
        <label>22.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Herbst, N.R., Kounev, S. and Reussner, R. (2013) Elasticity in Cloud Computing: What It Is, and What It Is Not. <italic>Proc</italic><italic>eeding of</italic> 10 <italic>th Int</italic><italic>ernational</italic><italic>Conf</italic><italic>erence</italic><italic>Autonomic Computing</italic>( <italic>ICAC</italic>), San Jose, 26-28 June 2013, 23-27.</mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Herbst, N.R.</string-name>
              <string-name>Kounev, S.</string-name>
              <string-name>Reussner, R.</string-name>
            </person-group>
            <year>2013</year>
            <article-title>Elasticity in Cloud Computing: What It Is, and What It Is Not</article-title>
            <source>Proceeding of 10th International Conference Autonomic Computing (ICAC)</source>
            <volume>26</volume>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B23">
        <label>23.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Qu, C., Calheiros, R.N. and Buyya, R. (2018) Auto-Scaling Web Applications in Clouds: A Taxonomy and Survey. <italic>ACM Computing Surveys</italic>, 51, 1-33. https://doi.org/10.1145/3148149 <pub-id pub-id-type="doi">10.1145/3148149</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/3148149">https://doi.org/10.1145/3148149</ext-link></mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Qu, C.</string-name>
              <string-name>Calheiros, R.N.</string-name>
              <string-name>Buyya, R.</string-name>
            </person-group>
            <year>2018</year>
            <article-title>Auto-Scaling Web Applications in Clouds: A Taxonomy and Survey</article-title>
            <source>ACM Computing Surveys</source>
            <volume>51</volume>
            <pub-id pub-id-type="doi">10.1145/3148149</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B24">
        <label>24.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">Moodle (2026) Performance Recommendations. https://docs.moodle.org/</mixed-citation>
          <element-citation publication-type="web">
            <year>2026</year>
            <article-title>Performance Recommendations</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B25">
        <label>25.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Jain, R. (1991) The Art of Computer Systems Performance Analysis. Wiley.</mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Jain, R.</string-name>
            </person-group>
            <year>1991</year>
            <article-title>The Art of Computer Systems Performance Analysis</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B26">
        <label>26.</label>
        <citation-alternatives>
          <mixed-citation publication-type="book">Harchol-Balter, M. (2013) Performance Modeling and Design of Computer Systems. Cambridge University Press. https://doi.org/10.1017/cbo9781139226424 <pub-id pub-id-type="doi">10.1017/cbo9781139226424</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1017/cbo9781139226424">https://doi.org/10.1017/cbo9781139226424</ext-link></mixed-citation>
          <element-citation publication-type="book">
            <person-group person-group-type="author">
              <string-name>Harchol-Balter, M.</string-name>
            </person-group>
            <year>2013</year>
            <article-title>Performance Modeling and Design of Computer Systems</article-title>
            <pub-id pub-id-type="doi">10.1017/cbo9781139226424</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B27">
        <label>27.</label>
        <citation-alternatives>
          <mixed-citation publication-type="confproc">Verma, A., Pedrosa, L., Korupolu, M., Oppenheimer, D., Tune, E. and Wilkes, J. (2015) Large-Scale Cluster Management at Google with Borg. <italic>Proceedings of the Tenth European Conference on Computer Systems</italic>, Bordeaux, 21-24 April 2015, 1-17. https://doi.org/10.1145/2741948.2741964 <pub-id pub-id-type="doi">10.1145/2741948.2741964</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/2741948.2741964">https://doi.org/10.1145/2741948.2741964</ext-link></mixed-citation>
          <element-citation publication-type="confproc">
            <person-group person-group-type="author">
              <string-name>Verma, A.</string-name>
              <string-name>Pedrosa, L.</string-name>
              <string-name>Korupolu, M.</string-name>
              <string-name>Oppenheimer, D.</string-name>
              <string-name>Tune, E.</string-name>
              <string-name>Wilkes, J.</string-name>
              <string-name>Systems, B</string-name>
            </person-group>
            <year>2015</year>
            <article-title>Large-Scale Cluster Management at Google with Borg</article-title>
            <source>Proceedings of the Tenth European Conference on Computer Systems</source>
            <volume>21</volume>
            <pub-id pub-id-type="doi">10.1145/2741948.2741964</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B28">
        <label>28.</label>
        <citation-alternatives>
          <mixed-citation publication-type="other">Burns, B., Grant, B., Oppenheimer, D., Brewer, E. and Wilkes, J. (2016) Borg, Omega, and Kubernetes. <italic>Communications of the ACM</italic>, 59, 50-57. https://doi.org/10.1145/2890784 <pub-id pub-id-type="doi">10.1145/2890784</pub-id><ext-link ext-link-type="uri" xlink:href="https://doi.org/10.1145/2890784">https://doi.org/10.1145/2890784</ext-link></mixed-citation>
          <element-citation publication-type="other">
            <person-group person-group-type="author">
              <string-name>Burns, B.</string-name>
              <string-name>Grant, B.</string-name>
              <string-name>Oppenheimer, D.</string-name>
              <string-name>Brewer, E.</string-name>
              <string-name>Wilkes, J.</string-name>
              <string-name>Borg, O</string-name>
            </person-group>
            <year>2016</year>
            <article-title>Borg, Omega, and Kubernetes</article-title>
            <source>Communications of the ACM</source>
            <volume>59</volume>
            <pub-id pub-id-type="doi">10.1145/2890784</pub-id>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B29">
        <label>29.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">Kemibaro, M. (2023) Why Does the KNEC Examinations Results Portal Crash Every Year? Medium. https://medium.com/</mixed-citation>
          <element-citation publication-type="web">
            <person-group person-group-type="author">
              <string-name>Kemibaro, M.</string-name>
            </person-group>
            <year>2023</year>
            <article-title>Why Does the KNEC Examinations Results Portal Crash Every Year? Medium</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
      <ref id="B30">
        <label>30.</label>
        <citation-alternatives>
          <mixed-citation publication-type="web">Apache Software Foundation (2026) Apache JMeter User Manual. https://jmeter.apache.org/usermanual/</mixed-citation>
          <element-citation publication-type="web">
            <year>2026</year>
            <article-title>Apache JMeter User Manual</article-title>
          </element-citation>
        </citation-alternatives>
      </ref>
    </ref-list>
  </back>
</article>