I don't have great data, it's mostly based on watching "top" while the 
osm2pgsql is running. And most of the time there's just a single backend doing 
COPY and consuming 100% of the time. Like this:

```
    PID  %CPU  %MEM     TIME+ COMMAND
  41997 123.5  10.7  19:15.48 osm2pgsql --drop -c --verbose --log-level debug 
-k -H localhost -d osm planet-251020.osm.pbf
  42007 100.0   0.1   7:09.87 postgres: azureuser osm ::1(41384) COPY
      1   0.0   0.0   0:03.42 /lib/systemd/systemd --system --deserialize=27
      2   0.0   0.0   0:00.02 [kthreadd]
```

I'm sure there are periods when it really is I/O bound, but this is clearly CPU 
bound. Processing COPY is not exactly free, and most of a perf profile is 
related to parsing the input, forming tuples, etc. That should parallelize 
pretty well, I think.

I don't think WAL contention, or contention on the relation would be a problem. 
It's a strategy we often use when generating large amounts of data for testing, 
and it works great. Of course, it assumes it does not get I/O bound 
(particularly on WAL). Sure, if the storage can't handle that, you won't get an 
improvement. But parallelism is meant to help "good" systems that don't have 
this bottleneck. (I'm testing this on a VM with 400GB of RAM and 6 NVMe drives 
in RAID0. It really is not I/O bound.)

Also, these are bulk WAL writes - large sequential writes, with very few 
fsyncs. So the system won't wait for the WAL all that much anyway. This is what 
strace tells me for the COPY backend:

```
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 97.13    0.998593           4    239801       215 recvfrom
  1.78    0.018331           1     13106           pwrite64
  0.37    0.003829           0      5774           lseek
  0.37    0.003827          11       327           pwritev
  0.28    0.002916           1      1919           fallocate
  0.02    0.000219           2        95        66 openat
  0.01    0.000144           0       218           sendto
  0.01    0.000108           0       144           pread64
  0.01    0.000071           0       212           epoll_wait
  0.00    0.000049           1        28           close
  0.00    0.000014           4         3           rt_sigreturn
  0.00    0.000012           4         3           getpid
  0.00    0.000007           2         3           setitimer
  0.00    0.000000           0         1           kill
------ ----------- ----------- --------- --------- ----------------
100.00    1.028120           3    261634       281 total
```
There's not a single fsync, it's all about reading data from the connection, 
and writing pages to disk.

Still, I may be wrong. I know a thing or two about Postgres, but I'm not all 
that familiar with OSM or osm2pgsql code. I only use it to evaluate Postgres 
improvement, etc. I won't be able to improve osm2pgsl myself (say, by adjusting 
the code to use a thread pool), but I'll be able to test / evaluate a patch if 
someone prepares one.

-- 
Reply to this email directly or view it on GitHub:
https://github.com/osm2pgsql-dev/osm2pgsql/discussions/2426#discussioncomment-14816357
You are receiving this because you are subscribed to this thread.

Message ID: 
<osm2pgsql-dev/osm2pgsql/repo-discussions/2426/comments/[email protected]>
_______________________________________________
Tile-serving mailing list
[email protected]
https://lists.openstreetmap.org/listinfo/tile-serving

Reply via email to