OK saya punya kesimpulan yang mirip dengan Darren, meskipun mekanisme profiling sedikit berbeda (NB login lambat masih dapat terjadi di Yosemite).
Berikut adalah cara untuk mengetahui apa yang sebenarnya sedang berjalan saat Anda memulai jendela login baru, menggunakan perintah sampel profiler OS X.
Cari tahu perintah apa yang dijalankan oleh login normal
$ ps -ef | grep login
Anda akan melihat sesuatu seperti login -pfl username /bin/bash -c exec -la bash /bin/bash
Buat nama file skrip profile_login.sh
dengan konten berikut dengan menambahkan a
-c ""
ke akhir perintah yang ditemukan untuk meminta bash segera kembali, dengan konten seperti ini:
login -pfl username /bin/bash -c exec -la bash /bin/bash -c "" &
sudo sample $! -mayDie # sample the above command
Jadikan itu dapat dieksekusi
$ chmod u+x profile_login.sh
dan jalankan dengan menggunakan sudo ( sample
perintah mengharuskannya)
$ sudo ./profile_login.sh
OK jadi silakan jalankan. Misalnya dengan menjalankan purge
perintah terlebih dahulu. Di kotak saya, saya mendapat grafik output yang besar. Mencari "cabang-cabang bernomor terbesar" (biasanya di atas) saya melihat dua pelanggar terbesar berikut :
Satu dari sesuatu yang disebut pam_start
yang muncul untuk membuka gambar pam auth lib
+ ! 1068 pam_start (in libpam.2.dylib) + 132 [0x7fff97295ab0]
+ ! : 1066 openpam_dynamic (in libpam.2.dylib) + 120 [0x7fff97293d14]
+ ! : | + ! 1042 coresymbolication_load_image(CSCppDyldSharedMemoryPage*, ImageLoader const*, unsigned long long) (in dyld) + 143 [0x7fff66725411]
+ ! : | + ! : 1042 mach_msg_trap (in dyld) + 10 [0x7fff6674a472]
dan itu terkadang diikuti oleh pelaku lain getlastlogxbyname
+ ! 583 getlastlogxbyname (in libsystem_c.dylib) + 212 [0x7fff92b3ef7a]
+ ! : 566 asl_file_open_read (in libsystem_asl.dylib) + 143 [0x7fff8c27030d]
+ ! : | 566 __open_nocancel (in libsystem_kernel.dylib) + 10 [0x7fff97b39012] + ! : | 566 __open_nocancel (in libsystem_kernel.dylib) + 10 [0x7fff97b39012]
Jadi pada dasarnya, ada dua pelaku. Salah satunya adalah pam
(beberapa jenis sistem otentikasi) dan yang lainnya adalah asl
"deteksi login terbaru Anda". Begitu rupanya hanya menghapus Anda /private/var/log/asl/*.asl
file tidak cukup. Pemuatan pam jauh lebih mahal pada mesin saya, toh [SSD]. Jangan ragu untuk menjalankan skrip di atas dan melihat apakah sistem Anda sama. Menariknya, kode sumber untuk panggilan metode ini tampaknya juga tersedia online, misalnya openpam_dynamic
Jika saya mengikuti jawaban Darren, dan mengganti preferensi "shells open with" saya dengan sesuatu selain / bin / bash, saya kemudian melihat baris berikut yang digunakan untuk memulai tab terminal baru:
$ ps -ef | grep login
... login -pfql packrd /bin/bash -c exec -la bash /usr/bin/bash
Jadi jika sekarang saya menggunakan sample
trik yang sama pada perintah login baru
login -pfql username /bin/bash -c exec -la bash /usr/bin/bash -c "" &
sudo sample $! -mayDie
stacktrace yang jauh lebih kecil dihasilkan, pelaku terbesar adalah:
+ 8 pam_end (in libpam.2.dylib) + 190 [0x7fff97294ebb]
+ ! 6 coresymbolication_unload_image(CSCppDyldSharedMemoryPage*, ImageLoader const*) (in dyld) + 143 [0x7fff6e0f634f]
Saya pikir ini karena parameter login "-q" sekarang sedang digunakan. Rupanya parameter ini melompati memuat modul pam dan mencari waktu login terakhir (kedua pelaku). Menurut dokumen login
perintah, menyentuh ~/.hushlogin
file harus melakukan hal yang sama, tetapi ternyata ini tidak lagi berfungsi [setidaknya untuk saya dengan 10.10].
Jadi, secara ringkas, menghapus /private/var/log/asl/*.asl tidak cukup (dalam percobaan saya, itu hanya menyumbang paling banyak 1/3 dari pelambatan yang sebenarnya, meskipun jika Anda punya file di sana, itu bisa menjelaskan untuk persentase yang lebih besar, saya yakin).
Pokoknya menggunakan skrip yang serupa, Anda harus dapat mengetahui apa yang menyebabkan mesin lokal Anda macet, dan melihat apakah perbaikan di atas berlaku untuk Anda. Jangan ragu untuk berkomentar di sini.
UPDATE: tampaknya coresymbolication_load_image
masih bisa memakan waktu banyak, bahkan ketika login -pfql
dipanggil (mungkin beberapa modul otentikasi pam atau lainnya harus "dial out" ke server login pusat atau sejenisnya, jadi harus menunggu respons dari pihak ke-3 ). Jadi satu-satunya solusi nyata yang saya temukan adalah menggunakan iTerm2, dan ubah preferensi -> profil -> umum -> Perintah untuk /bin/bash
sebaliknya.
.bash_profile
(juga memeriksa~/.profile
dengan cara). Juga: perhatikan Anda dapat mulai mengetik saat bash sedang memuat, dan biasanya apa yang Anda ketik akan disalin ke command prompt setelah siap.