FastNetMon

Показаны сообщения с ярлыком libc. Показать все сообщения
Показаны сообщения с ярлыком libc. Показать все сообщения

вторник, 11 мая 2010 г.

LD_DEBUG и подробнейший трейсинг работы динамического линкера

Кучу интересной информации о процессе можно получить вот так:
LD_DEBUG=all php -V


Для PHP отрывок выдачи будет вот такой:

1 29320:
2 29320: file=libcrypt.so.1 [0]; needed by php [0]
3 29320: find library=libcrypt.so.1 [0]; searching
4 29320: search cache=/etc/ld.so.cache
5 29320: trying file=/lib/libcrypt.so.1
6 29320:
7 29320: file=libcrypt.so.1 [0]; generating link map
8 29320: dynamic: 0x00007f22d3d83df8 base: 0x00007f22d3b7b000 size: 0x00000000002371c0
9 29320: entry: 0x00007f22d3b7ba30 phdr: 0x00007f22d3b7b040 phnum: 9
10 29320:
11 29320:
12 29320: file=libz.so.1 [0]; needed by php [0]
13 29320: find library=libz.so.1 [0]; searching
14 29320: search cache=/etc/ld.so.cache
15 29320: trying file=/usr/lib/libz.so.1

четверг, 22 апреля 2010 г.

Использование nscd на CentOS / Debian

Имеем тормоза с DNS:

time wget -q -O/dev/null xx.com

real 0m16.113s
user 0m0.003s
sys 0m0.002s

time wget -q -O/dev/null xxx.com

real 0m16.215s
user 0m0.001s
sys 0m0.002s


Ставим nscd, который суперски умеет кэшировать запросы к DNS

CentOS way

yum install -y nscd


Активируем запуск при загрузке:
chkconfig nscd on


Запускаем:
/etc/init.d/nscd start


Debian way

apt-get install -y nscd


Статистику работы nscd можно узнать командой:
nscd -g


Через несколько суток работы nscd на одном из наших хостинг-серверов было получены следующие значения:


nscd -g
nscd configuration:

0 server debug level
4d 17h 21m 20s server runtime
8 current number of threads
32 maximum number of threads
0 number of times clients had to wait
no paranoia mode enabled
3600 restart internal

passwd cache:

yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
18296 used data pool size
600 seconds time to live for positive entries
20 seconds time to live for negative entries
26303 cache hits on positive entries
0 cache hits on negative entries
18186 cache misses on positive entries
36 cache misses on negative entries
59% cache hit rate
190 current number of cached values
542 maximum number of cached values
7 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/passwd for changes

group cache:

yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
17648 used data pool size
3600 seconds time to live for positive entries
60 seconds time to live for negative entries
3283 cache hits on positive entries
0 cache hits on negative entries
4439 cache misses on positive entries
67 cache misses on negative entries
42% cache hit rate
245 current number of cached values
268 maximum number of cached values
8 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/group for changes

hosts cache:

no cache is enabled
yes cache is persistent
yes cache is shared
0 suggested size
0 total data pool size
0 used data pool size
3600 seconds time to live for positive entries
20 seconds time to live for negative entries
0 cache hits on positive entries
0 cache hits on negative entries
0 cache misses on positive entries
0 cache misses on negative entries
0% cache hit rate
0 current number of cached values
0 maximum number of cached values
0 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/hosts for changes

services cache:

yes cache is enabled
yes cache is persistent
yes cache is shared
211 suggested size
216064 total data pool size
1432 used data pool size
28800 seconds time to live for positive entries
20 seconds time to live for negative entries
32 cache hits on positive entries
0 cache hits on negative entries
15 cache misses on positive entries
1876 cache misses on negative entries
1% cache hit rate
9 current number of cached values
26 maximum number of cached values
2 maximum chain length searched
0 number of delays on rdlock
0 number of delays on wrlock
0 memory allocations failed
yes check /etc/services for changes



А вот потребление памяти:
ps aux | grep nscd
root 5138 0.0 0.0 346312 1020 ? Ssl Apr24 0:38 /usr/sbin/nscd


Теперь тестируем скорость работы DNS:
time wget -q -O/dev/null xxx.com

real 0m27.112s
user 0m0.003s
sys 0m0.001s

time wget -q -O/dev/null xxx.com

real 0m0.107s
user 0m0.001s
sys 0m0.001s

time wget -q -O/dev/null xxx.com

real 0m0.106s
user 0m0.001s
sys 0m0.001s

time wget -q -O/dev/null xxx.com

real 0m0.105s
user 0m0.000s
sys 0m0.002s


Теперь если отключить nscd, проблема вернется:

time wget -q -O/dev/null xxx.com

real 0m22.109s
user 0m0.000s
sys 0m0.003s


Важное замечание

nscd умеет кэшировать не только DNS запросы, но и кучу всяких других тяжелых операций, выполняемых из libc, например: getpwnam, getpwuid, getgrnam, getgrgid, gethostbyname (как раз DNS).

Nscd provides caching for accesses of the passwd(5), group(5), and hosts(5)
databases through standard libc interfaces, such as getpwnam(3), getpwuid(3),
getgrnam(3), getgrgid(3), gethostbyname(3), and others.


Причем, не стоит бояться ошибок кэширования, так как он очень умный:
The daemon will try to watch for changes in configuration files appropriate
for each database (e.g. /etc/passwd for the passwd database or /etc/hosts and
/etc/resolv.conf for the hosts database), and flush the cache when these are
changed.


http://kernel.org/doc/man-pages/online/pages/man8/nscd.8.html

понедельник, 19 апреля 2010 г.

Пересборка libc6 в Debian 5 Lenny

Ога, даже такое может потребоваться :)

Ставим все для сборки:
apt-get install -y dpkg-dev devscripts build-essential fakeroot



cd /usr/src
apt-get build-dep libc6 -y
apt-get source libc6 -y
cd glibc-2.7


Накладываем патчи:

debian/rules patch


После этого в папке ls build-tree/glibc-2.7/ можно видеть все необходимое для сборки, заходим туда и нагло патчим все, что нужно :)

На правах ремарки, код сборки ld-linux.so.2 расположен по пути: build-tree/glibc-2.7/elf/Makefile. Вызов сборки идет из:
build-tree/glibc-2.7/Makefile:

100 # Make sure that the dynamic linker is installed before libc.
101 $(inst_slibdir)/libc-$(version).so: elf/ldso_install


А сам код расположен в build-tree/glibc-2.7/elf.

Собираем libc:

debian/rules build


Собираем бинарный пакет:
fakeroot debian/rules binary


Итого в папке /usr/src появится куча файлов, из которых нам нужны:

libc6-dev-i386_2.7-18lenny2_amd64.deb
libc6-dev_2.7-18lenny2_amd64.deb
libc6-i386_2.7-18lenny2_amd64.deb
libc6_2.7-18lenny2_amd64.deb


Так как в стандартной сборке Дебы:
dpkg -l | grep 'GNU C Library'
ii libc6 2.7-18lenny2 GNU C Library: Shared libraries
ii libc6-dev 2.7-18lenny2 GNU C Library: Development Libraries and Hea
ii libc6-dev-i386 2.7-18lenny2 GNU C Library: 32bit development libraries f
ii libc6-i386 2.7-18lenny2 GNU C Library: 32bit shared libraries for AM


Ставим:

dpkg -i libc6-dev-i386_2.7-18lenny2_amd64.deb libc6-dev_2.7-18lenny2_amd64.deb libc6-i386_2.7-18lenny2_amd64.deb libc6_2.7-18lenny2_amd64.deb


Блокируем пропатченный libc от апдейта:
echo "libc6 hold" | dpkg --set-selections
echo "libc6-i386 hold" | dpkg --set-selections
echo "libc6-i386-dev hold" | dpkg --set-selections
echo "libc6-dev hold" | dpkg --set-selections


Спасибо за помощь: http://www.pubbs.net/200910/ubuntu/23274-re-how-to-apply-a-patch-to-glibc-and-build-it.html и http://www.debian.org/doc/maint-guide/ch-build.en.html

вторник, 9 марта 2010 г.

Как указать путь ко своим .so файлам или "cannot open shared object file: No such file or directory"

Для этого есть переменная среды: LD_LIBRARY_PATH, которая указывает расположение пользовательских динамических библиотек. Также есть способ глобально добавить свою папку в путь поиска посредством ldconfig.

Имеем приложение, слинкованное с нашим кастомным cURL, которого система не видит:

ldd a.out
libcurl.so.4 => not found
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00002b7bbd9e1000)
libm.so.6 => /lib/libm.so.6 (0x00002b7bbdced000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00002b7bbdf70000)
libc.so.6 => /lib/libc.so.6 (0x00002b7bbe188000)
/lib64/ld-linux-x86-64.so.2 (0x00002b7bbd7c4000)


Теперь добавляем свой путь поиска динамических библиотек и все работает нормально:

LD_LIBRARY_PATH=/opt/curl7_20_0/lib ldd a.out
libcurl.so.4 => /opt/curl7_20_0/lib/libcurl.so.4 (0x00002ac50ca84000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00002ac50ccdd000)
libm.so.6 => /lib/libm.so.6 (0x00002ac50cfe9000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00002ac50d26c000)
libc.so.6 => /lib/libc.so.6 (0x00002ac50d484000)
libssh2.so.1 => /usr/lib/libssh2.so.1 (0x00002ac50d7d7000)
libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0x00002ac50d9fa000)
libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0x00002ac50dc4c000)
librt.so.1 => /lib/librt.so.1 (0x00002ac50dfe7000)
libz.so.1 => /usr/lib/libz.so.1 (0x00002ac50e1f0000)
/lib64/ld-linux-x86-64.so.2 (0x00002ac50c867000)
libgcrypt.so.11 => /usr/lib/libgcrypt.so.11 (0x00002ac50e408000)
libgpg-error.so.0 => /usr/lib/libgpg-error.so.0 (0x00002ac50e66f000)
libnsl.so.1 => /lib/libnsl.so.1 (0x00002ac50e772000)
libdl.so.2 => /lib/libdl.so.2 (0x00002ac50e98b000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00002ac50eb8f000)


Запускать софт с кастомным путем до динамических библиотек аналогично:

LD_LIBRARY_PATH=/opt/curl7_20_0/lib ./a.out