> ## Documentation Index
> Fetch the complete documentation index at: https://docs.appsignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Global VM Lock

export const VersionRequirements = ({versions = []}) => {
  if (!Array.isArray(versions) || versions.length === 0) {
    return null;
  }
  const boundaries = {
    upper: " or lower",
    exact: "",
    lower: " or higher"
  };
  const containerStyle = {
    marginTop: "0.5rem",
    marginBottom: "1.5rem"
  };
  const lineStyle = {
    display: "block",
    margin: "0 0 0.35rem 0",
    fontSize: "0.875rem",
    lineHeight: "1.4"
  };
  const pillBaseStyle = {
    display: "inline-block",
    padding: "0.1em 0.4em",
    borderRadius: "0.25rem",
    border: "1px solid",
    fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
    fontSize: "0.85em",
    fontWeight: 500
  };
  const pillColors = {
    "AppSignal for Elixir": {
      background: "#f3e8ff",
      borderColor: "#e9d5ff",
      color: "#9333ea"
    },
    "AppSignal for Front-end": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Go": {
      background: "#ccfbf1",
      borderColor: "#99f6e4",
      color: "#0d9488"
    },
    "AppSignal for JavaScript": {
      background: "#fef9c3",
      borderColor: "#fde68a",
      color: "#ca8a04"
    },
    "AppSignal for Node.js": {
      background: "#dcfce7",
      borderColor: "#bbf7d0",
      color: "#16a34a"
    },
    "AppSignal for Python": {
      background: "#dbeafe",
      borderColor: "#bfdbfe",
      color: "#2563eb"
    },
    "AppSignal for Ruby": {
      background: "#fee2e2",
      borderColor: "#fecaca",
      color: "#dc2626"
    },
    "AppSignal for Rust": {
      background: "#ffedd5",
      borderColor: "#fed7aa",
      color: "#ea580c"
    }
  };
  const defaultPillColor = {
    background: "#f4f4f5",
    borderColor: "#e4e4e7",
    color: "#52525b"
  };
  const getPillStyle = name => ({
    ...pillBaseStyle,
    ...pillColors[name] || defaultPillColor
  });
  const getBoundText = bound => {
    return boundaries[bound] || boundaries.lower;
  };
  return <div style={containerStyle}>
      {versions.map((v, i) => <p key={`${v.name}-${v.version}-${v.bound || "lower"}-${i}`} style={lineStyle}>
          This feature requires{" "}
          <code style={getPillStyle(v.name)}>{v.name}</code> version {v.version}
          {getBoundText(v.bound)}.
        </p>)}
    </div>;
};

<VersionRequirements
  versions={[
{ name: "AppSignal for Ruby", version: "3.3.9" },
{ name: "Ruby", version: "3.2" },
{ name: "gvltools", version: "0.2" }
]}
/>

De Ruby VM (Virtual Machine) plant Ruby-threads in voor uitvoering. Op elk gegeven moment kan slechts één thread tegelijk actief zijn en interactie hebben met de status van de Ruby VM.

Het mechanisme waarmee de Ruby-interpreter dit garandeert, is de Global VM Lock (GVL).

Het wisselen tussen threads heeft zijn eigen overhead. De metrieken van de Global VM Lock laten u zien hoeveel tijd een thread besteedt aan het wachten op zijn beurt om uitgevoerd te worden, en het aantal threads dat op een bepaald moment op uitvoering wacht. Deze metrieken kunnen nuttige inzichten bieden voor het begrijpen van prestatieproblemen in uw applicatie.

Wanneer AppSignal Global VM Lock-metrieken detecteert, maakt het een [Magic Dashboard](#magic-dashboard) aan, waardoor u kerncijfers visueel kunt monitoren.

## Installatie

<Warning>
  De `gvltools`-bibliotheek is alleen compatibel met de officiële
  Ruby-interpreter. JRuby wordt niet ondersteund.
</Warning>

Om AppSignal Global VM Lock-metrieken te laten verkrijgen, moet u de `gvltools`-bibliotheek aan uw project toevoegen:

<CodeGroup>
  ```shell Shell theme={null}
  bundle add gvltools
  ```
</CodeGroup>

Eenmaal geïnstalleerd, zal de AppSignal-integratie elke minuut automatisch Global VM Lock-metrieken verzamelen.

## Magic dashboards

Magic dashboards verschijnen in de sectie [Dashboard](https://appsignal.com/redirect-to/app?to=dashboard) van AppSignal.

<img src="https://mintcdn.com/appsignal-715f5a51/4TRZP0Sq9Zq7PAPW/assets/images/screenshots/ruby/integrations/global-vm-lock/magic-dashboard.png?fit=max&auto=format&n=4TRZP0Sq9Zq7PAPW&q=85&s=005c856a34ea7513ae781ce685cb6c45" alt="Ruby GVL magic dashboard creation" width="2548" height="1430" data-path="assets/images/screenshots/ruby/integrations/global-vm-lock/magic-dashboard.png" />

Het Global VM Lock magic dashboard bevat de volgende grafieken:

| Grafiek                                   | Metriek               |
| ----------------------------------------- | --------------------- |
| [Global timer](#global-timer-graph)       | `gvl_global_timer`    |
| [Waiting threads](#waiting-threads-graph) | `gvl_waiting_threads` |

AppSignal rapporteert de volgende tags voor Global VM Lock-metrieken:

| Naam           | Beschrijving                                               |
| -------------- | ---------------------------------------------------------- |
| `hostname`     | De naam van de host waarvan de metriek is gerapporteerd    |
| `process_id`   | Het ID van het proces waarvan de metriek is gerapporteerd  |
| `process_name` | De naam van het proces waarvan de metriek is gerapporteerd |

<Tip>
  De tags `process_id` en `process_name` worden alleen gerapporteerd bij gebruik
  van AppSignal voor Ruby versie 3.9.3 of nieuwer.
</Tip>

<img src="https://mintcdn.com/appsignal-715f5a51/4TRZP0Sq9Zq7PAPW/assets/images/screenshots/ruby/integrations/global-vm-lock/dashboard-graphs.png?fit=max&auto=format&n=4TRZP0Sq9Zq7PAPW&q=85&s=7adb9334fbf51a1ab2d6e28aad0c5d3f" alt="Ruby GVL magic dashboard" width="2200" height="872" data-path="assets/images/screenshots/ruby/integrations/global-vm-lock/dashboard-graphs.png" />

### Global timer-grafiek

De global timer-grafiek toont de tijd die threads tijdens de laatste minuut hebben besteed aan het wachten om te worden hervat, dat wil zeggen wachten tot hun code opnieuw wordt uitgevoerd.

#### Meten van de global timer configureren

Het meten van de global timer heeft een geschatte prestatie-overhead van 5%.

Om negatieve gevolgen voor de prestaties van uw applicatie te voorkomen, kunt u `gvl_global_timer` standaard uitschakelen en deze inschakelen wanneer dat nodig is voor specifieke requests of thread-intensieve jobs.

Om deze metriek bij opstarten uit te schakelen, stelt u [de configuratieoptie `enable_gvl_global_timer`](/ruby/configuration/options#option-enable_gvl_global_timer) in op `false`.

Vervolgens kunt u de `gvltools`-bibliotheek gebruiken om de global timer-meting in en uit te schakelen zonder uw applicatie opnieuw te hoeven starten:

<CodeGroup>
  ```ruby Ruby theme={null}
  require "gvltools"

  GVLTools::GlobalTimer.enable

  # some code that uses threads ...

  GVLTools::GlobalTimer.disable
  ```
</CodeGroup>

### Waiting threads-grafiek

De waiting threads-grafiek toont het aantal threads dat op een bepaald moment wacht om te worden hervat. De grafiek bevat geen threads die niet klaar zijn om hervat te worden, zoals threads die slapen of wachten op een I/O-event.

Om deze metriek uit te schakelen, kunt u [de configuratieoptie `enable_gvl_waiting_threads`](/ruby/configuration/options#option-enable_gvl_waiting_threads) op `false` zetten.
