Skip to main content

Parca and Parca Agent as systemd Units

Setting up Parca

tip

You can find interactive version of this tutorial at our Katacoda account. Check it out here.

You can download the latest binary release for your architecture from our releases page.

curl -sL https://raw.githubusercontent.com/parca-dev/parca/main/parca.yaml > parca.yaml curl -sL https://github.com/parca-dev/parca/releases/download/v0.11.1/parca_0.11.1_`uname -s`_`uname -m`.tar.gz | tar xvfz -

Move the binary to a place where we can refer:

mv ./parca /usr/bin

Let's install external dependencies:

apt-get install llvm binutils elfutils
note

/usr/bin was selected as an example and used in the subsequent sections of this tutorial.

And let's create a user for Parca:

adduser --system --no-create-home --group parca

Parca runs with an example configuration file by default, that makes Parca to scrape itself.

debug_info:
bucket:
type: "FILESYSTEM"
config:
directory: "/tmp"
cache:
type: "FILESYSTEM"
config:
directory: "/tmp"

scrape_configs:
- job_name: "default"
scrape_interval: "2s"
static_configs:
- targets: ["127.0.0.1:7070"]
mkdir -p /etc/parca && cp editor/parca.yaml /etc/parca/parca.yaml

Now you can run the Parca as a systemd unit with the following simple configuration:

[Unit]
Description=Parca service
Requires=network-online.target
After=network-online.target

[Service]
User=parca
Group=parca
Restart=on-failure
RestartSec=10
ExecStart=/usr/bin/parca --config-path=/etc/parca/parca.yaml
ExecReload=/bin/kill -HUP $MAINPID
LimitNOFILE=65535
NoNewPrivileges=true
ProtectHome=true
ProtectSystem=full
ProtectHostname=true
ProtectControlGroups=true
ProtectKernelModules=true
ProtectKernelTunables=true
LockPersonality=true
RestrictRealtime=yes
RestrictNamespaces=yes
MemoryDenyWriteExecute=yes
PrivateDevices=yes
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=parca

[Install]
WantedBy=multi-user.target

To use the configuration, we need to move it a directory that systemd can load:

cp parca.service /etc/systemd/system/parca.service

And then simply start the unit:

sudo systemctl start parca

This will start the Parca server on port 7070 and configure it to retrieve profiles from itself every 1 second automatically.

Once Parca is running, you can navigate to the web interface on the browser.

image

Setting up Parca Agent

You can download the latest agent binary release for your architecture from our releases page.

curl -sL https://github.com/parca-dev/parca-agent/releases/download/v0.8.0/parca-agent_0.8.0_`uname -s`_`uname -m`.tar.gz | tar xvfz -

Move the binary to a place where we can refer:

mv ./parca-agent /usr/bin

You can run the Parca Agent as a systemd unit with the following simple configuration:

[Unit]
Description=Parca Agent

[Service]
Type=simple
User=root
Group=root

ExecStart=/usr/bin/parca-agent --http-address=":7071" --node=systemd-test --systemd-units=docker.service,parca.service,parca-agent.service --kubernetes=false --store-address=localhost:7070 --insecure

Restart=on-failure
RestartSec=10

StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=parcaagent

[Install]
WantedBy=multi-user.target

The command in the above configuration targets the Parca server that is presumably running on your system. And it uses the systemd service discovery to find the cgroups that have been running on your system.

To use the configuration, we need to move it a directory that systemd can load:

cp parca-agent.service /etc/systemd/system/parca-agent.service

And then simply start the unit:

sudo systemctl start parca-agent

The systemd service will be collecting profiles from docker.service, parca.service and parca-agent.service that have been running on your system.