Portál AbcLinuxu, 6. května 2025 06:22

Dotaz: C, multithread libcurl s openssl a paměťová náročnost

6.4.2022 14:33 MilanC | skóre: 16
C, multithread libcurl s openssl a paměťová náročnost
Přečteno: 938×
Odpovědět | Admin
Ahoj,

nějak si nevím rady. Píši komunikančí aplikaci, která má za cíl synchronizovat nastavení embedded zařízení.

Má aplikace využívá sdílených knihoven:
./msdk-linux-objdump -x ../../../romfs/bin/sthelper | grep NEEDED
  NEEDED               libapmib.so
  NEEDED               libcurl.so.4
  NEEDED               libm.so.0
  NEEDED               libjson-c.so.5
  NEEDED               libpthread.so.0
  NEEDED               libcrypto.so.1.0.0
  NEEDED               libc.so.0
Všechny tyto sdílené knihovny mají dohromady velikost asi 2,5 MB. V aplikaci využívám vlákna, některá jsou pevně daná, jiná se alokují dynamicky. Každé vlákno nějakým způsobem komunikuje po internetu, většinu času ale spí. Typicky je vláken třeba 6-10. V každém vlákně vytvářím vlastní CURL handle, je to dle příkladu: https://curl.se/libcurl/c/threaded-ssl.html. Používám také zámky pro openssl (crypto.h), které jsem tam popsány.

Nikde příliš nemohu najít, jestli by se nedal CURL handle sdílet mezi vlákny, třeba s pomocí curl_easy_setopt(curl, CURLOPT_SHARE, ...). Většinou píšou, že můj postup je správný a každý thread si vytváří a spravuje vlastní CURL handle přes curl_easy_init/curl_easy_cleanup.

Můj problém je v tom, že spuštěná aplikace třeba s 8 vlákny si vezme cca 20MB RAM.

Pokusy jsem dospěl k poznání, že to je asi závislé jen na počtu otevřených CURL handlů. Je to Embedded zařízení a takové nároky jsou problém. Navíc počet vláken se může v čase zvyšovat (dle informací získaných přes API). Načež mi zbývají třeba 3MB free RAM. Dostat do toho embedded linuxu valgrind a memcheck se mi sice podařilo, ale použít mi nejde, kvůli nedostatku RAM. Následující výpisy možná napoví, pokud je tu někdo, kdo se v tom vyzná...
/ # cat /proc/4870/status
Name:   sthelper
State:  S (sleeping)
Tgid:   4870
Pid:    4870
PPid:   1
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 32
Groups:
VmPeak:    24848 kB
VmSize:    20944 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:      5536 kB
VmRSS:      5520 kB
VmData:    17248 kB
VmStk:       160 kB
VmExe:        48 kB
VmLib:      3040 kB
VmPTE:        48 kB
VmSwap:        0 kB
Threads:        8
SigQ:   0/160
SigPnd: 00000000000000000000000000000000
ShdPnd: 00000000000000000000000000000000
SigBlk: 00000000000000000000000000000000
SigIgn: 00000000000000000000000000001004
SigCgt: 00000000000000000000000180000002
CapInh: 0000000000000000
CapPrm: 0000001fffffffff
CapEff: 0000001fffffffff
CapBnd: 0000001fffffffff
Cpus_allowed:   1
Cpus_allowed_list:      0
voluntary_ctxt_switches:        1041
nonvoluntary_ctxt_switches:     24
Zde je vidět, že nejvíce zabírá VmData. (size of data, stack, and text segments) Tedy předpokládám, že jsou to proměnné, nejspíš ty mé CURL handles. Když nějaká vlákna vykomentuji, náročnost na paměť jde docela dost dolů (cca 3-4MB na vlákno).
/ # cat /proc/4870/maps
00400000-0040c000 r-xp 00000000 1f:01 76         /bin/sthelper
00418000-0041c000 rw-p 00008000 1f:01 76         /bin/sthelper
0041c000-0066c000 rwxp 00000000 00:00 0          [heap]
75fa0000-75fa4000 ---p 00000000 00:00 0
75fa4000-761a0000 rw-p 00000000 00:00 0          [stack:4892]
761a0000-761a4000 ---p 00000000 00:00 0
761a4000-763a0000 rw-p 00000000 00:00 0          [stack:4891]
763a0000-763a4000 ---p 00000000 00:00 0
763a4000-765a0000 rw-p 00000000 00:00 0          [stack:4890]
765a0000-765a4000 ---p 00000000 00:00 0
765a4000-767a0000 rw-p 00000000 00:00 0          [stack:4889]
767a0000-767a4000 ---p 00000000 00:00 0
767a4000-769a0000 rw-p 00000000 00:00 0          [stack:4888]
769a0000-769a4000 ---p 00000000 00:00 0
769a4000-76ba0000 rw-p 00000000 00:00 0          [stack:4885]
76ba0000-76ba4000 ---p 00000000 00:00 0
76ba4000-76da0000 rw-p 00000000 00:00 0          [stack:4879]
76da0000-76dac000 rw-s 00000000 00:04 98307      /SYSV3e0a0239 (deleted)
76dac000-76db8000 rw-s 00000000 00:04 65538      /SYSV3d0a0239 (deleted)
76db8000-76dbc000 r-xp 00000000 1f:01 344        /lib/libdl-0.9.33.so
76dbc000-76dc8000 ---p 00000000 00:00 0
76dc8000-76dcc000 rw-p 00000000 1f:01 344        /lib/libdl-0.9.33.so
76dcc000-76e24000 r-xp 00000000 1f:01 375        /lib/libssl.so.1.0.0
76e24000-76e30000 ---p 00000000 00:00 0
76e30000-76e38000 rw-p 00054000 1f:01 375        /lib/libssl.so.1.0.0
76e38000-76e88000 r-xp 00000000 1f:01 369        /lib/libuClibc-0.9.33.so
76e88000-76e94000 ---p 00000000 00:00 0
76e94000-76e98000 rw-p 0004c000 1f:01 369        /lib/libuClibc-0.9.33.so
76e98000-76e9c000 rw-p 00000000 00:00 0
76e9c000-77014000 r-xp 00000000 1f:01 358        /lib/libcrypto.so.1.0.0
77014000-77020000 ---p 00000000 00:00 0
77020000-77038000 rw-p 00174000 1f:01 358        /lib/libcrypto.so.1.0.0
77038000-7703c000 rw-p 00000000 00:00 0
7703c000-77050000 r-xp 00000000 1f:01 361        /lib/libpthread-0.9.33.so
77050000-7705c000 ---p 00000000 00:00 0
7705c000-77060000 rw-p 00010000 1f:01 361        /lib/libpthread-0.9.33.so
77060000-77064000 rw-p 00000000 00:00 0
77064000-77080000 r-xp 00000000 1f:01 347        /lib/libjson-c.so.5.1.0
77080000-7708c000 ---p 00000000 00:00 0
7708c000-77090000 rw-p 00018000 1f:01 347        /lib/libjson-c.so.5.1.0
77090000-770a8000 r-xp 00000000 1f:01 368        /lib/libm-0.9.33.so
770a8000-770b4000 ---p 00000000 00:00 0
770b4000-770b8000 rw-p 00014000 1f:01 368        /lib/libm-0.9.33.so
770b8000-77130000 r-xp 00000000 1f:01 355        /lib/libcurl.so.4.7.0
77130000-77140000 ---p 00000000 00:00 0
77140000-77144000 rw-p 00078000 1f:01 355        /lib/libcurl.so.4.7.0
77144000-77150000 r-xp 00000000 1f:01 353        /lib/libapmib.so
77150000-7715c000 ---p 00000000 00:00 0
7715c000-7716c000 rw-p 00008000 1f:01 353        /lib/libapmib.so
7716c000-77170000 rw-p 00000000 00:00 0
77170000-77178000 r-xp 00000000 1f:01 348        /lib/ld-uClibc-0.9.33.so
77178000-7717c000 rw-s 00000000 00:04 32769      /SYSV410a0239 (deleted)
7717c000-77180000 rw-s 00000000 00:04 0          /SYSV3c0a0239 (deleted)
77180000-77184000 rw-p 00000000 00:00 0
77184000-77188000 rw-p 00004000 1f:01 348        /lib/ld-uClibc-0.9.33.so
7ff40000-7ff64000 rwxp 00000000 00:00 0          [stack]
7fff4000-7fff8000 r-xp 00000000 00:00 0          [vdso]
/ # cat /proc/4870/statm
1309 345 172 3 0 1088 0
/ # cat /proc/4870/smaps
00400000-0040c000 r-xp 00000000 1f:01 76         /bin/sthelper
Size:                 48 kB
Rss:                  48 kB
Pss:                  48 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:        48 kB
Private_Dirty:         0 kB
Referenced:           48 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd ex mr mw me dw
00418000-0041c000 rw-p 00008000 1f:01 76         /bin/sthelper
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me dw ac
0041c000-0066c000 rwxp 00000000 00:00 0          [heap]
Size:               2368 kB
Rss:                2272 kB
Pss:                2272 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:      2272 kB
Referenced:         2272 kB
Anonymous:          2272 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr ex mr mw me ac
75fa0000-75fa4000 ---p 00000000 00:00 0
Size:                 16 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me ac
75fa4000-761a0000 rw-p 00000000 00:00 0          [stack:4892]
Size:               2032 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
761a0000-761a4000 ---p 00000000 00:00 0
Size:                 16 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me ac
761a4000-763a0000 rw-p 00000000 00:00 0          [stack:4891]
Size:               2032 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
763a0000-763a4000 ---p 00000000 00:00 0
Size:                 16 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me ac
763a4000-765a0000 rw-p 00000000 00:00 0          [stack:4890]
Size:               2032 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
765a0000-765a4000 ---p 00000000 00:00 0
Size:                 16 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me ac
765a4000-767a0000 rw-p 00000000 00:00 0          [stack:4889]
Size:               2032 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
767a0000-767a4000 ---p 00000000 00:00 0
Size:                 16 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me ac
767a4000-769a0000 rw-p 00000000 00:00 0          [stack:4888]
Size:               2032 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
769a0000-769a4000 ---p 00000000 00:00 0
Size:                 16 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me ac
769a4000-76ba0000 rw-p 00000000 00:00 0          [stack:4885]
Size:               2032 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
76ba0000-76ba4000 ---p 00000000 00:00 0
Size:                 16 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me ac
76ba4000-76da0000 rw-p 00000000 00:00 0          [stack:4879]
Size:               2032 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
76da0000-76dac000 rw-s 00000000 00:04 98307      /SYSV3e0a0239 (deleted)
Size:                 48 kB
Rss:                  16 kB
Pss:                   8 kB
Shared_Clean:          0 kB
Shared_Dirty:         16 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:           16 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr sh mr mw me ms
76dac000-76db8000 rw-s 00000000 00:04 65538      /SYSV3d0a0239 (deleted)
Size:                 48 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr sh mr mw me ms
76db8000-76dbc000 r-xp 00000000 1f:01 344        /lib/libdl-0.9.33.so
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:        16 kB
Private_Dirty:         0 kB
Referenced:           16 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd ex mr mw me
76dbc000-76dc8000 ---p 00000000 00:00 0
Size:                 48 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me
76dc8000-76dcc000 rw-p 00000000 1f:01 344        /lib/libdl-0.9.33.so
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
76dcc000-76e24000 r-xp 00000000 1f:01 375        /lib/libssl.so.1.0.0
Size:                352 kB
Rss:                 304 kB
Pss:                 304 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:       304 kB
Private_Dirty:         0 kB
Referenced:          304 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd ex mr mw me
76e24000-76e30000 ---p 00000000 00:00 0
Size:                 48 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me
76e30000-76e38000 rw-p 00054000 1f:01 375        /lib/libssl.so.1.0.0
Size:                 32 kB
Rss:                  32 kB
Pss:                  32 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        32 kB
Referenced:           32 kB
Anonymous:            32 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
76e38000-76e88000 r-xp 00000000 1f:01 369        /lib/libuClibc-0.9.33.so
Size:                320 kB
Rss:                 304 kB
Pss:                  22 kB
Shared_Clean:        304 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:          304 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd ex mr mw me
76e88000-76e94000 ---p 00000000 00:00 0
Size:                 48 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me
76e94000-76e98000 rw-p 0004c000 1f:01 369        /lib/libuClibc-0.9.33.so
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
76e98000-76e9c000 rw-p 00000000 00:00 0
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
76e9c000-77014000 r-xp 00000000 1f:01 358        /lib/libcrypto.so.1.0.0
Size:               1504 kB
Rss:                1280 kB
Pss:                1280 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:      1280 kB
Private_Dirty:         0 kB
Referenced:         1280 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd ex mr mw me
77014000-77020000 ---p 00000000 00:00 0
Size:                 48 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me
77020000-77038000 rw-p 00174000 1f:01 358        /lib/libcrypto.so.1.0.0
Size:                 96 kB
Rss:                  96 kB
Pss:                  96 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        96 kB
Referenced:           96 kB
Anonymous:            96 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
77038000-7703c000 rw-p 00000000 00:00 0
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
7703c000-77050000 r-xp 00000000 1f:01 361        /lib/libpthread-0.9.33.so
Size:                 80 kB
Rss:                  80 kB
Pss:                  80 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:        80 kB
Private_Dirty:         0 kB
Referenced:           80 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd ex mr mw me
77050000-7705c000 ---p 00000000 00:00 0
Size:                 48 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me
7705c000-77060000 rw-p 00010000 1f:01 361        /lib/libpthread-0.9.33.so
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
77060000-77064000 rw-p 00000000 00:00 0
Size:                 16 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
77064000-77080000 r-xp 00000000 1f:01 347        /lib/libjson-c.so.5.1.0
Size:                112 kB
Rss:                 112 kB
Pss:                 112 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:       112 kB
Private_Dirty:         0 kB
Referenced:          112 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd ex mr mw me
77080000-7708c000 ---p 00000000 00:00 0
Size:                 48 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me
7708c000-77090000 rw-p 00018000 1f:01 347        /lib/libjson-c.so.5.1.0
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
77090000-770a8000 r-xp 00000000 1f:01 368        /lib/libm-0.9.33.so
Size:                 96 kB
Rss:                  16 kB
Pss:                   4 kB
Shared_Clean:         16 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:           16 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd ex mr mw me
770a8000-770b4000 ---p 00000000 00:00 0
Size:                 48 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me
770b4000-770b8000 rw-p 00014000 1f:01 368        /lib/libm-0.9.33.so
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
770b8000-77130000 r-xp 00000000 1f:01 355        /lib/libcurl.so.4.7.0
Size:                480 kB
Rss:                 464 kB
Pss:                 464 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:       464 kB
Private_Dirty:         0 kB
Referenced:          464 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd ex mr mw me
77130000-77140000 ---p 00000000 00:00 0
Size:                 64 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me
77140000-77144000 rw-p 00078000 1f:01 355        /lib/libcurl.so.4.7.0
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
77144000-77150000 r-xp 00000000 1f:01 353        /lib/libapmib.so
Size:                 48 kB
Rss:                  48 kB
Pss:                  15 kB
Shared_Clean:         48 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:           48 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd ex mr mw me
77150000-7715c000 ---p 00000000 00:00 0
Size:                 48 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: mr mw me
7715c000-7716c000 rw-p 00008000 1f:01 353        /lib/libapmib.so
Size:                 64 kB
Rss:                  64 kB
Pss:                  53 kB
Shared_Clean:         16 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        48 kB
Referenced:           64 kB
Anonymous:            48 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
7716c000-77170000 rw-p 00000000 00:00 0
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
77170000-77178000 r-xp 00000000 1f:01 348        /lib/ld-uClibc-0.9.33.so
Size:                 32 kB
Rss:                  32 kB
Pss:                   1 kB
Shared_Clean:         32 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:           32 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd ex mr mw me dw
77178000-7717c000 rw-s 00000000 00:04 32769      /SYSV410a0239 (deleted)
Size:                 16 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr sh mr mw me ms
7717c000-77180000 rw-s 00000000 00:04 0          /SYSV3c0a0239 (deleted)
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr sh mr mw me ms
77180000-77184000 rw-p 00000000 00:00 0
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me ac
77184000-77188000 rw-p 00004000 1f:01 348        /lib/ld-uClibc-0.9.33.so
Size:                 16 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr mr mw me dw ac
7ff40000-7ff64000 rwxp 00000000 00:00 0          [stack]
Size:                160 kB
Rss:                  16 kB
Pss:                  16 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:        16 kB
Referenced:           16 kB
Anonymous:            16 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd wr ex mr mw me gd ac
7fff4000-7fff8000 r-xp 00000000 00:00 0          [vdso]
Size:                 16 kB
Rss:                   0 kB
Pss:                   0 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:         0 kB
Referenced:            0 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:       16 kB
MMUPageSize:          16 kB
Locked:                0 kB
VmFlags: rd ex mr mw me de
Nemá někdo zkušenost s libcurl, jestli má můj problém nějaké řešení? Libcurl používám poslední verzi, openssl je 1.0.2d.

V pár fórech jsem našel podobné problémy, kdy si lidi stěžovali, že se paměť po curl_easy_cleanup ve vlákně neuvolní. Prý to tak je, a uvolňuje se až po curl_global_cleanup, nicméně ten lze volat pouze 1x při ukončování aplikace.

Také do dělám tak, že můj thread je vlastně nekonečná smyčka (reagující jen na ukončovací signál) se sleepem v řádu minut. Thread se vždy probudí, udělá akci přes curl a zase uspí. Vždy v této iteraci volám curl_easy_init a na konci curl_easy_cleanup. Není to tedy tak, že bych curl_easy_init volal jen 1x před smyčkou thredu a při ukončování vlákna pak curl_easy_cleanup. Tuto variantu jsem myslím zkoušel, ale nepřišlo mi, že by se paměťová náročnost lišila.

Ještě podotknu, že thready se vykonávají třeba po minutě a paměťová náročnost aplikace je i po mnoha hodinách cca stejná, jako na začátku. Takže ta výsledná náročnost podle mého nesouvisí s memory leeks apod.

Budu rád, pokud někoho něco napadne. Děkuji.

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

6.4.2022 20:46 X
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Odpovědět | | Sbalit | Link | Blokovat | Admin
Na "synchronizaci nastaveni" je rekl bych libcurl zbytecny overkill. Musi to byt nutne HTTPS? To nemuzes zabalit jen CRC data? Napis to nativne pres socket. Pokud hledas inspiraci doporucuji nejaky moderni botnet, ktery ma vyresenou rychlou a sifrovanou synchronizaci s C&C serverem.
6.4.2022 21:36 MilanC | skóre: 16
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Ano, HTTPS proti API informačního systému (se kterým se bavím) je dané, tedy zatím tomu tak je. :-)
7.4.2022 16:56 j
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
To se dela tak, ze pred to das "proxy". Viz predrecnik, na tehle malejch vecech proste nemuzes pouzivat tyhle rozezrany knihovny, ktery umej miliardu veci ktery nanic nepotrebujes.

Takze se s tim netrap, napis to tak minimalisticky jak je to akceptovatelny (vazne to potrebujes sifrovat?) a napis si k tomu "server", kterej to prelozi na to https a kterej pustis nekde, kde te mega sem nebo tam netrapi.

Http je vsechno mozny jen ne protokol vhodnej na obecnou komunikaci. A presne proto to spousta appek pouziva ...

BTW: Jakejpa myslis ze ma oficielni duvod to, ze ipsec uz neni povinou soucasti ipv6 ...

---

Dete s tim guuglem dopice!
7.4.2022 05:45 kvr
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Odpovědět | | Sbalit | Link | Blokovat | Admin
20 MB je docela dost, nejsou tam nějaké buffery, kde by se dala upravit velikost apod?

Jinak si matně vzpomínám, že má i connection pool, aby se nemuselo navazovat pokaždé nové spojení. Tohle by šlo taky nastavit na jedinou connection.

Ohledně předchozího komentáře - IMHO je https dobrá volba, aspoň nějaká bezpečnost, komunikace přímo přes socket je recept na man-in-the-middle a jiné. Autentikace by byla plus :-)
7.4.2022 09:51 MilanC | skóre: 16
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Přesně to hledám. Já nepotřebuji pro každý thread oddělenou curl inicializaci / handle, ale prostě nemohu najít řešení, jak ten curl handle z hlavního vlákna bezpečně sdílet do threadů. Tak, aby to fungovalo korektně, tedy včetně těch SSL zámků, které moc nechápu jak vlastně fungují (crypto.m), protože se přímo na můj kód nijak nevážou. Volám jen init a kill těch dvou převzatých funkcí z toho příkladu. :-)
7.4.2022 10:05 X
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jen takova logicka poznamka. Kdyz na tom embedded zarizeni pustis v teminalu curl, nebo wget tak to prece nemuze vzit 0, 0 nic z RAM a za par vterin to mas stazene = neco delas blbe.
7.4.2022 11:13 MilanC | skóre: 16
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Když si stejnou url (https) zavolám přes binárku curlu, která má pochopitelně stejné závislosti - tedy libcurl.so a libssl.so a libcrypt.so, vezme si toto jedno vykonání 4.9MB paměti.
  PID  PPID USER     STAT   VSZ %MEM CPU %CPU COMMAND
 5020  4876 root     S     4912 11.8   0  0.0 curl https://...
Tedy to koresponduje s mým poznatkem o paměťové náročnosti na 1 curl handle.

Pokud by můj multithread kód šel přepsat na jediný sdílený curl handle, je to řešení.

Další možnost, co mě napadá je libcurl kompilovat s nějakým jiným SSL balíkem, na výběr je toho dost (ssl,gnutls,nss,polarssl,mbedtls,cyassl,axtls,winssl,darwinssl) a jistě by třeba některý mohl být méně náročný.

Tady je ale otázka, jestli je to rozežranost curlu jako takového nebo spíš té podpory SSL.

Ještě jsem narazil na projekt https://curl.se/tiny/, asi vyzkouším, mohlo by to být také řešení.

Zatím díky.
7.4.2022 11:49 X
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Asi to nechapu, ale to mas otevrenych 8 session naraz? Neni to chyba v navrhu reseni? Z male embedd desticky muzes vyzdimat jem omezenou funkcionalitu. Trapit se s 40MB v dobe, kdy kazde SBC zacina na 2GB nedava moc vyznam. Nic proti teto usporne challange..
7.4.2022 11:58 MilanC | skóre: 16
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Právě že nemám 8 session naráz, to je ten problém. Když to zjednoduším do pseudokódu, mám třeba 8 instancí téhož vlákna, které udělá...
while(isRunning) {
  curl_easy_init
    //zpracuje a odešle výsledek
  curl_easy_cleanup  // zde se ale paměť neuvolní
  sleep(300)
}
S názorem na HW souhlasím, ale to šéfovi nevysvětlíš, že by za dalších 32 MB RAM musel připlatit $0,5/kusu.
7.4.2022 12:07 X
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
No tak sem soupni ten zdrojak. Treba to bude jen nejaka mala bota.
7.4.2022 13:32 MilanC | skóre: 16
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
No moc se mi nechtělo, předem se omlouvám, hlavně ten kód v main je zatím trochu prasárna... https://pastebin.com/FLnsZwRW

Jinak 2 vlákna jsou fixní (inform_worker a config_worker) a pak je n-vláken task_worker. Díky
7.4.2022 13:45 MilanC | skóre: 16
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Jinak něco se mi podařilo optimalizovat na straně libcurl použitím množství --disable-* a --without-* při překladu libcurl knihovny. Ale je to spíše symbolické, třeba 100 KB / vlákno. :) Na druhou stranu zbytečné tam mít podporu věcí, které se nikdy nevyužijí.

Jinak ještě ohledně libcurl, co zaznělo výše. Tuto knihovnu jsem do firmware nedodával já, už je součástí a je využívána i jinými částmi (já jí jen povýšil na aktuální a vše překopal na sdílenou .so ze statické). Takže by byl asi problém jí úplně vyhodit/nahradit, maximálně jen v tom mém projektu. Což by mi ale zase trochu zvedlo náročnost ve flash, pokud bych řešil nějakou alternativu.

Prostě mám 8MB FLASH a to si člověk moc vyskakovat nemůže, už když jen linux kernel mu zabere půlku. :)

Ten tinycurl jsem narychlo zkusil nahodit také, ale velikostně mi to přišlo úplně stejné. Ještě na to kouknu, možná se to překládá ještě nějak jinak.
7.4.2022 22:02 X
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Lehce se to rika, ale wolfSSL, MbedTLS jsou primo pro embedded zarizeni s pametovym omezenim. To by stalo za pokus.
7.4.2022 14:37 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ak curl, skus curl-minimal. Viac:
debian.plus@protonmail.com
7.4.2022 15:09 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Odpovědět | | Sbalit | Link | Blokovat | Admin
V aplikaci využívám vlákna, některá jsou pevně daná, jiná se alokují dynamicky. Každé vlákno nějakým způsobem komunikuje po internetu, většinu času ale spí. Typicky je vláken třeba 6-10. V každém vlákně vytvářím vlastní CURL handle, je to dle příkladu: https://curl.se/libcurl/c/threaded-ssl.html. Používám také zámky pro openssl (crypto.h), které jsem tam popsány.
Čo chceš? Ak chceš mať jednu inštancia = jedno práve realizované sťahovanie. Ak chceš, môžeš to inštanciu použivať pre rôzne URL, ale podmienkou je, že iba jedna sa môže sťahovať v jednom okamihu. Ak nechceš aby príliš dlho trvala (trebars, nechceš aby blokovala frontu, ak nastane nejaká chyba), tak nastav timeout pre curl query (parameter pre curl).
debian.plus@protonmail.com
7.4.2022 16:50 kvr
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jestli to žere skutečně nějakou konstantu per thread a jestli máš krátké requesty, které se dají serializovat, tak nejjednodušší bude pouštět curl jenom z jednoho threadu - něco jako Java ExecutorService, akorát si ho v C asi budeš muset napsat sám:

         pthread_create(&executorFunction, null);

void executorFunction(void *)
{
        for (;;) {
               pthread_mutex_lock(&queueLock);
               while (queue.isEmpty())
                       pthread_cond_wait(&queueCond, &queueLock);
              task_request *tr = queue.pop();
              pthred_mutex_unlock(&queueLock);
              (*tr->task)(tr->arg);
              pthread_mutext_lock(&tr->lock);
              pthread_cond_broadcast(&tr->cond);
              pthread_mutext_unlock(&tr->lock);
        }
}

void execute(void (*task)(), void *arg)
{
        pthread_mutex_lock(&queueLock);
        task_request = { function: task, arg: arg, lock: lock, cond: cond };
        pthread_mutext_lock(&tr->task->lock);
        queue.append(&task_request);
        pthread_cond_broadcast(&queueCond, &queueLock);
        pthread_cond_wait(&tr->cond, &tr->lock);
        pthread_mutext_unlock(&tr->lock);
        pthred_mutex_unlock(&queueLock);
}

void myLogicalThread()
{
         ...
         for (;;) {
                curl_result result;
                execute(&requestCurl, { url: ..., result: &result });
                ... do something
                sleep...
         }
}
Jakože rámcově, šlo by to samozřejmě asi o dost chytřeji a celá ta logika by se mohla pouštět radši v jednom schedulovaném threadu (někdo tu řešil nedávno, jak pouštět něco pravidelně, aniž by musel vytvořit spoustu threadů).
7.4.2022 21:30 .
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jeden handle můžeš používat z více vláken, jen ne současně. Takže bys tam teoreticky prostě přidal mutex. Ale v tom programu není nic, co by muselo běžet paralelně, takže ty vlákna vyjeb a dělej to v jednom.
8.4.2022 11:21 luky
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nestacila by libfetch? Je mensi nez curl.
Řešení 1× (MilanC (tazatel))
8.4.2022 15:06 MM
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Odpovědět | | Sbalit | Link | Blokovat | Admin
Co píše 'ulimit'? Co zkusit 'ulimit -s' a zmenšit stack pro nové procesy/thready?
Řešení 1× (MilanC (tazatel))
8.4.2022 15:15 MM
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Viz taky TOTO
8.4.2022 16:34 MilanC | skóre: 16
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Ahoj, toto vypadá na dobrý point.

Defaultně mám max. velikost stacku 8MB (uname -s).

Pokus: Když jsem změnil na 512 kB, tak paměťová náročnost aplikace je cca poloviční a v RAM zabírá kolem 10MB. Při 64k (ulimit -s 64) pak cca 6.2MB RAM.

Otázka je, pokud budu zkoušet jít cestou pthread_attr_setstacksize, jak určit tu vhodnou velikost.

Takto se to tváří, že aplikace funguje, nic neprotestuje ani nepadá.
8.4.2022 17:18 X
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Je to vychozi minimalni velikost alokace pro vlakno..
9.4.2022 02:30 MilanC | skóre: 16
Rozbalit Rozbalit vše Re: C, multithread libcurl s openssl a paměťová náročnost
Děkuji. Díky Tvé radě a s využitím pthread_attr_getstacksize jsem se dostal na spotřebu cca 6MB RAM, což je super rozdíl. Stack nastavuji 64kB/thread, i 32kB mi ještě fungovalo, 16kB už ne. Tak jsem zatím volil s trochou rezervy.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.