Replication automatically generates a Distribution CleanUp job that runs every 1/2 hour, and takes 15-20 minutes to run. I changed it to run every hour, and it took 1.5 hours to run.
Have you rebuilt the indexes? Got an extremely high number of transactions? Thats a lot longer that what I normally see. Maybe you have subscriptions expiring that have lots of pending transactions not distributed?