2012-06-05 23 views
7

Mam dziwne efekty uboczne na zmianę LD_LIBRARY_PATH.Efekty uboczne LD_LIBRARY_PATH

Kiedy dołączam ścieżkę zawierającą bibliotekę, np. :

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib 

Wtedy wszystko staje się niewiarygodnie powolne. Na przykład prosty ls może mieć 10 sekund.

ldd wyjście jest dokładnie taka sama przed i po zmianie LD_LIBRARY_PATH i starałem się debugowania wykonanie powolnego ls z strace: Mam dokładnie to samo wykonanie w obu przypadkach. Wykonanie nawet nie utknie podczas wykonywania ls (ponieważ strace nic nie wyprowadza podczas 10-sekundowego opóźnienia, a następnie nagle wykonuje się doskonale ls). Tak myślałem, że to przyjdzie z mojego powłoki, ale jest to ten sam, bieganie strace na moim bash i wykonywania ls w obu przypadkach daje mi ten sam strace wyjście: powłoka wykonuje ls i czekać na koniec jego realizacji (ostatni strace wyjście przed opóźnieniem strace jest waitpid(...)). Sądzę, że dzieje się coś złego pomiędzy uruchomieniem ls a jego wykonaniem, tak jakby był to problem na poziomie jądra. To naprawdę działa tak, jakby sleep został wykonany na ls (użycie 0 cpu).

czasie opóźnienia, mój CPU i aktywność sieci są całkowicie normalne ...

Zauważ, że biblioteka w nowej ścieżce LD nie jest sprzeczne z jakimkolwiek „standardowej biblioteki”, więc nie przeszkadza w moim ls przykład.

Więc jestem interesujący w głębszych wyjaśnieniach dotyczących efektów ubocznych LD_LIBRARY_PATH lub jak głęboko debugować mój przykład.

+0

Dobre pytanie. Użyłem 'LD_LIBRARY_PATH' i nigdy nie widziałem takiego zachowania, ale twoja obserwacja wydaje się być zarówno odizolowana, jak i jasna. Ciekawy. – thb

+7

'export LD_DEBUG = all' i' man 8 ld.so' –

+0

prawdopodobnie oczywiste, ale "ldd $ (który ls)" może dać wskazówkę, jeśli ls używa czegoś z LD_LIBRARY_PATH. – Matthias

Odpowiedz

0

Nie jestem pewien, co jeszcze jest na swoim LD_LIBRARY_PATH lub biblioteki, który próbujesz dodać lub jakiego programu używasz, ale prawdopodobnie lepiej napisanie skryptu otoki zmienić LD_LIBRARY_PATH tylko dla programu, który potrzebuje dodatkowych biblioteka, aby Twój system działał podobnie jak ls.

#!/bin/bash 
export LD_LIBRARY_PATH=/my_path/lib 
program_name 

Utwórz plik i chmod +x wrapper_name

+1

Tak, zgadzam się z tobą, ale jestem po prostu ofiarą istniejącego systemu budowy ... –

1

Ten post jest rzucić stary, więc nie wiem, jeśli okaże się już rozwiązanie. W każdym razie, nie wiem, czy to może pomóc, ale w większości współczesnych systemów GNU/Linux, , użycie LD_LIBRARY_PATH jest przestarzałe i zniechęca.

Dlatego mam kilka propozycji:

  1. jeśli chcesz nadal korzystać, spróbuj najpierw przez wstawienie zamiast dołączając swoją ścieżkę biblioteki do LD_LIBRARY_PATH. To powinno pomóc, jeśli jest coś, co zajmuje dużo czasu, aby zeskanować ścieżkę w poprzednich katalogach bibliotecznych.

  2. Użyj systemu LDCONFIG, który jest (nowy) prawidłowy sposób korzystania z katalogów LD w dzisiejszych czasach. Trzeba po prostu dodać ścieżkę do biblioteki w pliku /etc/ld.so.conf lub lepiej, dodać plik w /etc/ld.so.conf.d/która zawiera ścieżkę do twojej biblioteki (zostanie pobrana, jeśli istnieje dyrektywa włączająca w /etc/ld.so.conf, co zazwyczaj ma miejsce domyślnie). Następnie uruchom sudo ldconfig, aby zaktualizować ścieżkę wyszukiwania LD systemu.

Mam nadzieję, że ta pomoc. Pozdrowienia

Powiązane problemy