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

# Machine Sizing

Here are a few ways to set the size (CPU and memory) of your Machine VMs. This guide describes creating and sizing individual Machines with the Machines API and `fly machine` commands. For Fly Launch apps, the same general sizing rules apply, but you can also use `fly scale` commands to [update groups of Machines](/launch/scale-machine) or set a [default VM size](/reference/configuration#the-vm-section) in the `fly.toml` configuration file.

## General Rules

We have some [preset sizes](/about/pricing#started-fly-machines) for you to choose from. Each CPU selection defaults to a specific amount of memory.

You can, however, scale your machine's CPU and memory separately. Memory limits are `2gb * shared CPU size` or `8gb * performance CPU size`. Minimum memory is `256m * shared CPU size` or `2048m * performance CPU size`.

**Examples:**

* If you have 4 shared CPUs, the max memory you can add is `2048 * 4 = 8192`.
* If you have 4 performance CPU's, the max memory you can add is `8192 * 4 = 32768`.

## Using Size Presets

Any size listed for Machines on the [pricing page](/about/pricing#started-fly-machines) can be used when creating a Machine.

Here's what that looks like to launch a `performance-2x` machine (2 CPU, 4gb memory):

```bash theme={null}
curl -i -X POST \
  -H "Authorization: Bearer ${FLY_API_TOKEN}" \
  -H "Content-Type: application/json" \
  "http://${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines" \
  -d '{
  "name": "savvy-machine",
  "config": {
    "image": "some-savvy-image",
    "size": "performance-2x"
  }
}'
```

If you're using `flyctl`, the equivalent command looks like this:

```bash theme={null}
fly machine run \
    -a my-app-name \
    --name savvy-machine \
    --vm-size performance-2x \
    some-savvy-image
```

## Custom Sizes

When creating a machine, you can define the CPU and memory sizes yourself. Memory must be a multiple of 256 for shared sizes, and 2048 for performance sizes.

Here we create a machine with a 2 CPUs but double the RAM you'd get if using size `shared-cpu-2x`.

```bash theme={null}
curl -i -X POST \
  -H "Authorization: Bearer ${FLY_API_TOKEN}" \
  -H "Content-Type: application/json" \
  "http://${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines" \
  -d '{
  "name": "savvy-machine",
  "config": {
    "image": "some-savvy-image",
    "guest": {
      "cpu_kind": "shared",
      "cpus": 2,
      "memory_mb": 1024
    }
  }
}'
```

The `cpu_kind` parameter can be one of `shared` or `performance`. Learn more about CPU types and performance [here](/machines/cpu-performance).

If you're using `flyctl`, the equivalent command looks like this:

```bash theme={null}
fly machine run \
    -a my-app-name \
    --name savvy-machine \
    --vm-cpus 2 \
    --vm-memory 1024 \
    some-savvy-image
```

There is not yet a CLI flag for `shared` vs `performance`. It defaults to `shared` CPU types.

## Adjusting Machine Size

You can adjust CPU and memory by [updating a Machine](/machines/api/machines-resource#update-a-machine). Updating a machine replaces the VM with a new one, but machine ID stays the same.

If we create a machine with the same command as above (using 1024m memory), but later want to reduce that to 512m (the minimum allowed), we can make the following API call:

```bash theme={null}
# Updating a machine requires the *entire* config
# so treat this as an example
curl -i -X POST \
  -H "Authorization: Bearer ${FLY_API_TOKEN}" \
  -H "Content-Type: application/json" \
  "http://${FLY_API_HOSTNAME}/v1/apps/my-app-name/machines/73d8d46dbee589" \
  -d '{
  "config": {
    "image": "some-savvy-image",
    "guest": {
      "cpu_kind": "shared",
      "cpus": 2,
      "memory_mb": 512
    }
  }
}'
```

If you're using `flyctl`, the equivalent command looks like this:

```bash theme={null}
fly machine update \
    -a my-app-name \
    -i some-savvy-image \
    --vm-cpus 2 \
    --vm-memory 512 \
    73d8d46dbee589
```
