여러 버전 (sse4, ssse3, avx2, avx512)을 사용하는 glibc-2.25의 일부 메모리 함수 (memcpy, memset, memmove)가 Google 서버 프로그램의 성능 향상을 가져올 수 있는지 조사 중이었습니다. Linux (glibc 2.12).
첫 번째 시도는 여기 https://sourceware.org/glibc/wiki/Testing/Builds 지침에 따라 glibc-2.25의 타르 볼을 다운로드하고 빌드/테스트하는 것이 었습니다. 필자는 수동으로 커널 버전 검사를 주석 처리했으며 모든 것이 잘 진행되었습니다. 그런 다음 테스트 프로그램이 절에 나와있는 절차에 새로 건설의 glibc에 링크 된 glibc는 위키와 'LDD 테스트'의 "glibc는 빌드 트리에 대해 컴파일은"이 참으로 기대 라이브러리에 달려 있음을 보여줍니다포트 glibc 2.25 및 테스트 메모리 함수
# $GLIBC is /data8/home/wentingli/temp/glibc/build
libm.so.6 => /data8/home/wentingli/temp/glibc/build/math/libm.so.6 (0x00007fe42f364000)
libc.so.6 => /data8/home/wentingli/temp/glibc/build/libc.so.6 (0x00007fe42efc4000)
/data8/home/wentingli/temp/glibc/build/elf/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fe42f787000)
libdl.so.2 => /data8/home/wentingli/temp/glibc/build/dlfcn/libdl.so.2 (0x00007fe42edc0000)
libpthread.so.0 => /data8/home/wentingli/temp/glibc/build/nptl/libpthread.so.0 (0x00007fe42eba2000)
내가 사용하는 어떤 memset/memcpy가 실제로 호출되었는지 확인하기 위해 gdb를 실행했지만, 좀 더 진보 된 함수 (avx2, avx512)가 in use 일 수 있다고 기대하면서 항상 __memset_sse2_unaligned_erms가 사용되었음을 보여줍니다. 내 질문은 :
- 는 glibc에-2.25은 자동으로 CPU/OS/메모리 주소에 따라 메모리 기능의 가장 적합한 버전을 선택 했습니까? 그렇지 않다면 glibc를 빌드하는 동안 어떤 설정이 없거나 설정이 잘못 되었습니까?
- 새로운 glibc에서 메모리 기능을 이식하기위한 다른 대안이 있습니까?
도움이나 제안을 보내 주시면 감사하겠습니다.
[glibc 위키] (https://sourceware.org/glibc/wiki/Testing/Builds)는 새로운 glibc를 테스트 할 수있는 몇 가지 접근법을 제공하지만 프로덕션 환경에는 조금 복잡하고 적합하지 않은 것으로 보입니다. 일반적으로 우리는 fundermantal 핵심 시스템 구성 요소 인 glibc가 대체되어서는 안된다는 제안을 따른다. 이러한 문자열 함수를 별도로 구현하는 것은 약간 번거로운 일입니다 (특히 캐시/CPU 감지). – WindLeeWT
답장을 보내 주셔서 감사합니다. 내 마음에 LD_PRELOAD와 함께 새로운 glibc를 사용하면 프로그램이 불안정 해지고 예기치 않게 충돌이 발생합니다. 맞습니까? – WindLeeWT
빌드 디렉토리에있는'testrun.sh' 스크립트와 마찬가지로 제거 된 glibc에 대해 프로그램을 실행하려면 명시 적 동적 링커 호출을 사용해야합니다. –