systemd-analyze plot > boottimes.svg
Open the SVG and have a look at what's happening during boot.
journalctl -b will give you some more info too. If you're using grub to boot (probably in /boot/grub/grub.cfg), you can change the loglevel and add the udev option to get a bunch more info. Helped me with a random issue recently. Here's mine for an example:
### BEGIN /etc/grub.d/10_linux ###
menuentry 'Arch Linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-a96b3354-70dd-45ed-8c6c-95171e9f1e82' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_gpt
insmod ext2
search --no-floppy --fs-uuid --set=root a96b3354-70dd-45ed-8c6c-95171e9f1e82
echo 'Loading Linux linux ...'
linux /boot/vmlinuz-linux root=UUID=a96b3354-70dd-45ed-8c6c-95171e9f1e82 rw loglevel=3 udev.log-priority=debug
echo 'Loading initial ramdisk ...'
initrd /boot/amd-ucode.img /boot/initramfs-linux.img
}