I just finished a project with Sun One Portal Server and I agree with everything that was said previously.
Specific to Sun One Portal Server...
Be sure to run the performance tuning scripts they provide and make sure you use the mode that actually makes the changes or be prepared to do them manually.
Consider how many times a particular portet is called. We wrote some pretty generic portlets (JSR-168) to minimize the number of deployed applications. Example: We needed a link list portlet that provided more functionality than the one sun provides (...better user interaction for mainting the list). We created one portlet that used the preferences during channel configuration to establish the listname, who could edit it, etc. A portlet ultimately becomes a
servlet. All the channels configured up use that servlet to render the content and respond to actions. We had some 50 channels each with a different list. I had already set up caching both at the data access layer (singleton custom cache)and at the portal presentation layer on the channel itslef (refresh property). This handled most everything but under extreme load (using 6 remote
test machines running JMeter) we started throwing some exceptions related to concurrency. I don't recall the specific exception. What we did was to solve that was to deploy more that one instance of the portlet which in turn created more instances. We then altered the channels to spread them across the portlet app instances (especially where more than one instance of a list was on the same "page").
Lastly, make sure you performance test. JMeter does a pretty good job.
Good Luck!