Slow queries on billions-rows-table // index used
This may reflect my MS SQL bias, but I'd try clustering the table by timestamp.  If you're frequently pulling data for a specific time span, this will help because the data will be physically stored contiguously.  The system can seek to the start point, scan to the end of the range, and be done.  If you're querying for a specific hour, that's just 3,600,000 records.

If your query (which is...?) is for a specific machine, Postgres will then need to filter out 99.9% of those 3.6 M records.  If this one-in-a-thousand filter is more selective than a typical date range fitler, you should use the more selective mac field as the first component of your index.  It may still be worth clustering.

If that still doesn't do it, I'd partition by the same field you're indexing, either timestamp or mac.

You didn't give the data types.  Are they appropriate to the data?  Storing dates as text will needlessly bloat your table, for example.