Optimizing networking

The simplicity of Cloud Functions lets you quickly develop code and run it in a
serverless environment. At moderate scale, the cost of running functions is low,
and optimizing your code might not seem like a high priority. As your deployment
scales up, however, optimizing your code becomes increasingly important.

This document describes how to optimize networking for your functions. Some of
the benefits of optimizing networking are as follows:

Reduce CPU time spent in establishing new connections at each function call.

Accessing Google APIs

The example below uses Cloud Pub/Sub, but
this approach also works for other client libraries—for example,
Cloud Natural Language or
Cloud Spanner. Note that performance
improvements may depend on the current implementation of particular client
libraries.

Creating a PubSub client object results in one connection and two DNS queries
per invocation. To avoid unnecessary connections and DNS queries, create the
PubSub client object in global scope as shown in the sample below:

Load-testing Your Function

To measure how many connections your function performs on average, simply deploy
it as a HTTP function and use a performance-testing framework to invoke it at
certain QPS. One possible choice is Artillery, which you
can invoke with a single line:

$ artillery quick -d 300 -r 30 URL

This command fetches the given URL at 30 QPS for 300 seconds.

After performing the test, check the usage of your connection quota on the
Cloud Functions API quota page
in Cloud Console. If the usage is consistently around 30 (or its multiple), you
are establishing one (or several) connections in every invocation. After you
optimize your code, you should see a few (10-30) connections occur
only at the beginning of the test.

You can also compare the CPU cost before and after the optimization on the CPU
quota plot on the same page.